On Mon, Apr 9, 2012 at 1:18 PM, Konstantin Belousov <kostik...@gmail.com> wrote:
> On Mon, Apr 09, 2012 at 11:17:41AM +0400, Andrey Zonov wrote:
>> On 06.04.2012 12:13, Konstantin Belousov wrote:
>> >On Thu, Apr 05, 2012 at 11:54:53PM +0400, Andrey Zonov wrote:
[snip]
>> >>I always thought that active memory this is a sum of resident memory of
>> >>all processes, inactive shows disk cache and wired shows kernel itself.
>> >So you are wrong. Both active and inactive memory can be mapped and
>> >not mapped, both can belong to vnode or to anonymous objects etc.
>> >Active/inactive distinction is only the amount of references that was
>> >noted by pagedaemon, or some other page history like the way it was
>> >unwired.
>> >
>> >Wired is not neccessary means kernel-used pages, user processes can
>> >wire their pages as well.
>>
>> Let's talk about that in details.
>>
>> My understanding is the following:
>>
>> Active memory: the memory which is referenced by application.  An
> Assuming the part 'by application' is removed, this sentence is almost right.
> Any managed mapping of the page participates in the active references.
>
>> application may get memory only through mmap() (allocator don't use
>> brk()/sbrk() any more).  The resident memory of an application is the
>> sum of physical used memory.  So, sum of RSS is active memory.
> First, brk/sbrk is still used. Second, there is no requirement that
> resident pages are referenced. E.g. page could have participated in the
> buffer, and unwiring on the buffer dissolve put it into inactive state.
> Or pagedaemon cleared the reference and moved the page to inactive queue.
> Or the page was prefaulted by different optimizations.
>
> More, there is subtle difference between 'resident' and 'not causing fault
> on access'. Page may be resident, but pte was not preinstalled, or pte
> was flushed etc.

>From the user point of view: how can the memory be active if no-one (I
mean application) use it?

What I really saw not at once is that the program for a long time
worked with big mmap()'ed file, couldn't work well (many page faults)
with new version of the file, until I manually flushed active memory
by FS re-mounting.  New version couldn't force out the old one.  In my
opinion if VM moved cached objects to inactive queue after program
termination I wouldn't see this problem.

>>
>> Inactive memory: the memory which has no references.  Once we call
>> read() on the file, the file is in inactive memory, because we have no
>> references to this object, we just read it.  This is also released
>> memory by free().
> On buffers dissolve, buffer cache explicitely puts pages constituing
> the buffer, into the inactive queue. In fact, this is not quite right,
> e.g. if the same pages are mapped and actively referenced, then
> pagedaemon has slightly more work now to move the page from inactive
> to active.
>

Yes, sure, if someone else use the object it should be active and even
better to introduce new "SHARED" counter, like one is in MacOSX and
Linux.

> And, free(3) operates at so much higher level then vm subsystem that
> describing the interaction between these two is impossible in any
> definitive mood. Old naive mallocs put block description at the beggining
> of the block, actually causing free() to reference at least the first
> page of the block. Jemalloc often does madvise(MADV_FREE) for large
> freed allocations. MADV_FREE  moves pages between queues probabalistically.
>

That's exactly what I meant by free().  We drop act_count to 0 and
move page to inactive queue by vm_page_dontneed()

>>
>> Cache memory: I don't know what is it. It's always small enough to not
>> think about it.
> This was the bug you reported, and which Alan fixed on Sunday.
>

I've tested this patch under 9.0-STABLE and should say that it
introduces problems with interactivity on heavy disk loaded machines.
With the patch that I tested before I didn't observe such problems.

>>
>> Wired memory: kernel memory and yes, application may get wired memory
>> through mlock()/mlockall(), but I haven't seen any real application
>> which calls mlock().
> ntpd, amd from the base system. gpg and similar programs try to mlock
> key store to avoid sensitive material leakage to the swap. cdrecord(8)
> tried to mlock itself to avoid indefinite stalls during write.
>

Nice catch ;-)

>
>>
>> >>
>> >>>>
>> >>>>Read the file:
>> >>>>$ cat /mnt/random>   /dev/null
>> >>>>
>> >>>>Mem: 79M Active, 55M Inact, 1746M Wired, 1240M Buf, 45G Free
>> >>>>
>> >>>>Now the file is in wired memory.  I do not understand why so.
>> >>>You do use UFS, right ?
>> >>
>> >>Yes.
>> >>
>> >>>There is enough buffer headers and buffer KVA
>> >>>to have buffers allocated for the whole file content. Since buffers wire
>> >>>corresponding pages, you get pages migrated to wired.
>> >>>
>> >>>When there appears a buffer pressure (i.e., any other i/o started),
>> >>>the buffers will be repurposed and pages moved to inactive.
>> >>>
>> >>
>> >>OK, how can I get amount of disk cache?
>> >You cannot. At least I am not aware of any counter that keeps track
>> >of the resident pages belonging to vnode pager.
>> >
>> >Buffers should not be thought as disk cache, pages cache disk content.
>> >Instead, VMIO buffers only provide bread()/bwrite() compatible interface
>> >to the page cache (*) for filesystems.
>> >(*) - The cache term is used in generic term, not to confuse with
>> >cached pages counter from top etc.
>> >
>>
>> Yes, I know that.  I try once again to ask my question about buffers.
>> Is this reasonable to use for them 10% of the physical memory or we may
>> set rational upper limit automatically?
>>

This question is still without answer :)

>> >>
>> >>>>
>> >>>>Could you please give me explanation about active/inactive/wired memory?
>> >>>>
>> >>>>
>> >>>>>because I suspect that the current code does more harm than good. In
>> >>>>>theory, it saves activations of the page daemon. However, more often
>> >>>>>than not, I suspect that we are spending more on page reactivations
>> >>>>>than
>> >>>>>we are saving on page daemon activations. The sequential access
>> >>>>>detection heuristic is just too easily triggered. For example, I've
>> >>>>>seen
>> >>>>>it triggered by demand paging of the gcc text segment. Also, I think
>> >>>>>that pmap_remove_all() and especially vm_page_cache() are too severe
>> >>>>>for
>> >>>>>a detection heuristic that is so easily triggered.
>> >>>>>
>> >>>>[snip]
>> >>>>
>> >>>>--
>> >>>>Andrey Zonov
>> >>
>> >>--
>> >>Andrey Zonov
>>
>> --
>> Andrey Zonov



-- 
Andrey Zonov
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to