Date: Thu, 9 May 2002 17:04:26 -0700 (PDT) From: Matthew Dillon <dillon@apollo.backplane.com> To: Erik Trulsson <ertr1013@student.uu.se> Cc: freebsd-stable <freebsd-stable@FreeBSD.ORG> Subject: Re: Steadily increasing memory usage on a lightly loaded server Message-ID: <200205100004.g4A04Q2n029553@apollo.backplane.com> References: <20020509143427.GA28486@student.uu.se> <B8FFFDA1.CD1C%freebsd@damnhippie.dyndns.org> <20020509164709.GA29822@student.uu.se>
next in thread | previous in thread | raw e-mail | index | archive | help
:
: What this means is that FreeBSD will not try very hard to separate
: out dirty pages (inactive queue) from clean pages (cache queue) when
: the system is not being stressed, nor will it try to deactivate
: pages (active queue -> inactive queue) when the system is not being
: stressed, even if they are not being used.
:
:
:My interpretation is that the inactive queue does not really hold pages
:that are "dirty but not recently referenced" but rather pages that are
:"possibly dirty and not recently referenced", while the cache queue
:holds pages that are known not to be dirty.
:This probably means that under a normal load most of the pages in the
:inactive queue are not in fact dirty.
:
:<Insert your favourite quote here.>
:Erik Trulsson
:ertr1013@student.uu.se
You are correct. If the system is not being stressed you can wind
up with a large number of pages marked 'active' which are really
inactive, and a large number of pages marked 'inactive' which are
really cache. The original posting had this:
Mem: 23M Active, 618M Inact, 69M Wired, 40M Cache, 86M Buf, 1328K Free
This looks like a fairly unstressed system to me. The actual definitions
for the page queues are:
wired - similar to 'active' but these pages are wired into the
kernel (typically mapped to the kernel's buffer cache).
active - pages which the system will NOT try to free any time soon.
These pages may be clean or dirty and may be mapped to
user processes.
inactive - pages which are candidates for cleaning/freeing, which
have not been accessed in a long time (relative to the
'active' queue).
These pages may be clean or dirty and may still be mapped
to processes (but the processes haven't accessed the pages
recently).
These pages have a 'bent' towards being more accessible
and it generally does not cost a demand-page exception
to reactivate them. It costs a cleaning/unmapping cycle
in order to be able to free these pages.
cache - pages which the system can free and reuse with no notice.
These pages are still effectively 'disk cache' in that
an attempt to access them will cause a reactivation (move
them back to the active queue), but these pages are
guarenteed to be clean and not mapped to any process so
the system can simply steal them if it needs a free page
and doesn't have enough in the 'free' queue.
These pages have a 'bent' towards being more free and it
costs the system a demand-page exception to reactivate them.
It does not cost anything for the system to free/reuse
these pages.
free - truely free pages
In a lightly loaded system pages tend to stay 'active' or 'inactive'.
After all, there is no reason to unmap a page from a process's address
space even if the page is not being actively accessed until you absolutely
have to! It takes memory pressure in order to force the system to work
the queues.
Memory pressure takes the form of allocating a new page. The system
will first look for a completely free page from the 'free' queue. If
it can't find one it will look for a page in the 'cache' queue. If the
system notices that memory pressure has created a shortfall of free or
cache pages the system will 'clean' pages from the inactive queue and
move them to the cache queue (if the page is already 'clean' this only
involves unmapping the page from user processes address spaces). This
movement can create a shortfall in the inactive queue which causes the
system to move pages from the active queue to the inactive queue.
In a very heavily loaded system memory pressure occurs from two
directions. Memory allocations put memory pressure on the page
queues from the 'free' queue upwards, and programs accessing memory
put pressure on the 'active' queue downwards. You can visualize it
as two entities pulling on the queues from both ends at the same time.
Under extreme loads these two pressures stretch the queues beyond
their limits and the system is forced to start deactivating pages which
are still active, and is also forced to stall processes trying to
allocate new pages. This is fine until we get to the point where
the deactivated page is cleaned/freed before the original process
can reactivate it again, which means the system starts doing extra
disk I/Os. This is the definition of page 'thrashing'. At this
point the system starts taking emergency measures like enforced
process swapouts. But, as you can see, in FreeBSDland it takes
truely extreme memory pressure to create such a situation.
-Matt
Matthew Dillon
<dillon@backplane.com>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200205100004.g4A04Q2n029553>
