forgotten reply for this one:

2017-01-19 18:28 GMT+01:00 mostolog--- via rsyslog <
[email protected]>:

> Really interesting and instructive. Let me see if I understood properly:
>
> Considering the below explanation, an idle (not going to receive more
> messages the next 7 days) imrelp rsyslog...shouldn't memory be freed from
> current 512MB usage in the near future?
>

For the scenario I have described: no, as long as the high address memory
block is allocated, nothing is freed. Not even after 70 days of idleness ;-)


>
> You mentioned forcing each 100.000 messages, but that's never gonna happen
> if we are still at 20k, and no more messages coming.
>

right

Rainer

>
> Regards
>
>
> El 19/01/17 a las 11:16, Rainer Gerhards escribió:
>
>> 2017-01-19 10:19 GMT+01:00 mostolog--- via rsyslog <
>> [email protected] <mailto:[email protected]>>:
>>
>>
>>         with very few exceptions, rsyslog releases the memory as it
>>         goes, there should not be any significant amount of memory
>>         freed by rsyslog after it's been idle for a while.
>>
>>     But being idle for 15m should release memory from 512MB to a few
>>     KB if they aren't used, isnt it?
>>
>>
>> Memory alloc is not as simple as it seems ;-)
>>
>> First, clib does not always do a proper cleanup. I guess it seems not to
>> consolidate free space in all cases. There is a clib call to force this,
>> and rsyslog does it from time to time (I think every 100,000 messages). We
>> do not do it very frequently, because it is an expensive operation. Also
>> note that memory is reusable internally, so even though it is not returned
>> to the OS, further alloc requests inside rsyslog can use this memory and do
>> so. Returning memory to the OS and re-claiming it is expensive. Thus you do
>> want to keep some memory allocated but internally unused to avoid doing
>> this operation too frequently.
>>
>> Secondly, memory alloc from the OS is done by sbrk[1] IIRC. The important
>> point is that we need to alloc and free memory in sequence. This means if
>> you alloc 100MB, than alloc 1MB, you have the following memory layout
>>
>> BASE
>> 100MB
>> 1MB
>>
>> with the break at BASE+101MB. If you now free the 100MB chunk, you have
>> this layout:
>>
>> BASE
>> 100MB free
>> 1MB
>>
>> if you want to return to the OS, you'd need to copy down the 1MB to
>> immediatly after BASE, because otherwise you cannot reset the break to
>> BASE+1MB. The allocator does not do this, it would totally wrek performance
>> (note: that is not rsyslog specific, that is how the *C runtime* works).
>> More importantly, it would mean all pointers to it would need to be
>> updated. And the runtime does not know where these pointers are located. So
>> it would not only costly, compaction is simply impossible. Let's assume we
>> now alloc another 10 MB. Then we have
>>
>> BASE
>> 10MB
>> 90MB free
>> 1MB
>>
>> because the allocator uses the free, but still allocated mem. Now, let's
>> assume we free the 1MB chunk, we get:
>>
>> BASE
>> 10MB
>> 91MB free
>>
>> Now the free space is at the end of the data segment. So the alloc
>> subsystem has the choice to reduce memory alloc from the OS. It may or may
>> not dealloc. I don't know the exact rules, but the important thing is that
>> the alloc system uses some heuristic (plus the call I mentioned) to decide
>> if to dealloc. Let's assume it does. Then it reduceds the data segement
>> size and we get to
>>
>> BASE
>> 10MB
>>
>> effectively reducing rss by 91 MB.
>>
>> IMHO the alloc system strongly works on the assumption that memory
>> allocated (from the OS) but free internally does not really hurt, as it is
>> just virtual address space, which, if actually unused, is paged out to disk
>> once and then doesn't matter at all until it get's reused again.
>>
>> OF COURSE if we have constantly growing memory, the app seems not to free
>> some chunks, so the alloc system doesn't know they are free. This has
>> nothing to do with what I explained. What I explained just means that an
>> app may do proper free()'s, but the rss size doesn't reflect this. The
>> typical (and often visible) effect of that is that the app grows to a
>> certain size and then remains at it (no growth, no decrease). This is
>> where, via the clib call, we force free.
>>
>> There is one important point, though: if we have a memory block at the
>> far end of the data segment, we cannot return mem to the OS until this
>> block has been freed. In rsyslog, you typical see this if
>>
>> a) old-style "last message repeated n times" is active
>> b) an infrequently written-to output stores a message object when queues
>> are very full
>> c) no different messages are written to that output for a long time
>>
>> What here is very probably that in b) a high memory address is used for
>> that memory block. As due to c) we do not have any traffic, that high
>> address is kept in use for hours, maybe days. Once a different message
>> arrives at the output, the old object is processed and freed. This can
>> result in a very sharp decrease of rss size, especially if the system has
>> low load during such times. Let's assume this layout:
>>
>> BASE
>> 10MB used
>> 1.5GB free, but allocated from OS
>> 5k msg object
>>
>> If we now free those 5k, most probably the alloc system heuristic will
>> immediately return 1.5GB+5K to the OS, reducing the rss size accordingly.
>>
>> Bottom line: not everything that looks like a memory leak actually is one.
>>
>> HTH
>> [1] https://linux.die.net/man/2/sbrk
>>
>
> _______________________________________________
> rsyslog mailing list
> http://lists.adiscon.net/mailman/listinfo/rsyslog
> http://www.rsyslog.com/professional-services/
> What's up with rsyslog? Follow https://twitter.com/rgerhards
> NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad
> of sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you
> DON'T LIKE THAT.
>
_______________________________________________
rsyslog mailing list
http://lists.adiscon.net/mailman/listinfo/rsyslog
http://www.rsyslog.com/professional-services/
What's up with rsyslog? Follow https://twitter.com/rgerhards
NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad of 
sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you DON'T LIKE 
THAT.

Reply via email to