pageout question
Andriy Gapon
avg at freebsd.org
Sun Jul 25 10:07:27 UTC 2010
on 25/07/2010 02:31 RW said the following:
> On Sat, 24 Jul 2010 23:23:07 +0300
> Andriy Gapon <avg at freebsd.org> wrote:
>
>> There is a good deal of comments in the vm_pageout.c code that imply
>> that we use a hysteresis approach to deal with low available pages
>> condition.
>>
>>
>> In general, the hysteresis, the comments and the code make sense.
>> My doubt, though, is about the block of code that is right below the
>> comment quoted above:
>> if (vm_pages_needed && !vm_page_count_min()) {
>> if (!vm_paging_needed())
>> vm_pages_needed = 0;
>> wakeup(&cnt.v_free_count);
>> }
>
> As I understand it the hysteresis is done inside vm_pageout_scan, and
> the expectation is that one pass will typically satisfy this because the
> design aims to keep enough clean pages in the inactive queue.
I have seen these lines in vm_pageout_scan:
/*
* Calculate the number of pages we want to either free or move
* to the cache.
*/
page_shortage = vm_paging_target() + addl_page_shortage_init;
...
/*
* Compute the number of pages we want to try to move from the
* active queue to the inactive queue.
*/
page_shortage = vm_paging_target() +
cnt.v_inactive_target - cnt.v_inactive_count;
page_shortage += addl_page_shortage;
But I am not sure about "clean pages in the inactive queue" part.
>From what I can see in the code, pagedaemon only tries to maintain a certain
number of pages on inactive queue - I am speaking about vm_pageout_page_stats().
But I do not see any code ensuring level of _clean_ inactive pages.
And, if I am not mistaken, there is no guarantee even that those pages will not
be re-activated when pagedaemon actually scans them.
> I'm not sure if the vm_paging_needed() call is correct or not, but it
> may be that that the intent is to avoid immediately going back to a
> depleted inactive queue when cache+free is within normal bounds,
> because it could result in avoidable paging to swap.
Well, OTOH, if the current pass results in many pages being re-activated and
many pages still left on the inactive queue because they are dirty (see
maxlaunder in vm_pageout_scan), then it is premature to quit paging when we only
reached bare minimum of available pages (see pass and maxlaunder again). IMHO,
of course.
As a side discussion, I wonder if current setting of v_inactive_target is
adequate. It "feels" that it should be bigger.
--
Andriy Gapon
More information about the freebsd-hackers
mailing list