[Mailman-Users] Python process size grows 30x in 8 hours (memory
Fletcher Cocquyt
fcocquyt at stanford.edu
Wed Jul 2 05:26:23 CEST 2008
Pmap shows its the heap
god at irt-smtp-02:in 8:08pm 64 # pmap 24167
24167: /bin/python /opt/mailman-2.1.9/bin/qrunner
--runner=IncomingRunner:5:8
08038000 64K rwx-- [ stack ]
08050000 940K r-x-- /usr/local/stow/Python-2.5.2/bin/python
0814A000 172K rwx-- /usr/local/stow/Python-2.5.2/bin/python
08175000 312388K rwx-- [ heap ]
CF210000 64K rwx-- [ anon ]
<--many small libs -->
total 318300K
Whether its a leak or not - we need to understand why the heap is growing
and put a limit on its growth to avoid exausting memory and swapping into
oblivion...
None of the lists seem too big:
god at irt-smtp-02:lists 8:24pm 73 # du -sk */*pck | sort -nr | head | awk
'{print $1}'
1392
1240
1152
1096
912
720
464
168
136
112
Researching python heap alloaction....
thanks
On 7/1/08 6:14 PM, "Mark Sapiro" <mark at msapiro.net> wrote:
> Fletcher Cocquyt wrote:
>>
>> Here is the current leaked state since the the cron 13:27 restart only 3
>> hours ago:
>> last pid: 20867; load averages: 0.53, 0.47, 0.24
>> 16:04:15
>> 91 processes: 90 sleeping, 1 on cpu
>> CPU states: 99.1% idle, 0.3% user, 0.6% kernel, 0.0% iowait, 0.0% swap
>> Memory: 1640M real, 77M free, 1509M swap in use, 1699M swap free
>>
>> PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND
>> 24167 mailman 1 59 0 311M 309M sleep 0:28 0.02% python
>> 24158 mailman 1 59 0 308M 305M sleep 0:30 0.01% python
>> 24169 mailman 1 59 0 303M 301M sleep 0:28 0.01% python
>> 24165 mailman 1 59 0 29M 27M sleep 0:09 0.03% python
>> 24161 mailman 1 59 0 29M 27M sleep 0:12 0.07% python
>> 24164 mailman 1 59 0 28M 26M sleep 0:07 0.01% python
>> 24172 mailman 1 59 0 26M 24M sleep 0:04 0.01% python
>> 24160 mailman 1 59 0 26M 24M sleep 0:08 0.01% python
>> 24162 mailman 1 59 0 26M 23M sleep 0:10 0.01% python
>> 24166 mailman 1 59 0 26M 23M sleep 0:04 0.01% python
>> 24171 mailman 1 59 0 25M 23M sleep 0:04 0.02% python
>> 24163 mailman 1 59 0 24M 22M sleep 0:04 0.01% python
>> 24168 mailman 1 59 0 19M 17M sleep 0:03 0.02% python
>> 24170 mailman 1 59 0 9516K 6884K sleep 0:01 0.01% python
>> 24159 mailman 1 59 0 9500K 6852K sleep 0:00 0.00% python
>>
>> And the mapping to the runners:
>> god at irt-smtp-02:mailman-2.1.11 4:16pm 66 # /usr/ucb/ps auxw | egrep mailman
>> | awk '{print $2 " " $11}'
>> 24167 --runner=IncomingRunner:5:8
>> 24165 --runner=BounceRunner:0:1
>> 24158 --runner=IncomingRunner:7:8
>> 24162 --runner=VirginRunner:0:1
>> 24163 --runner=IncomingRunner:1:8
>> 24166 --runner=IncomingRunner:0:8
>> 24168 --runner=IncomingRunner:4:8
>> 24169 --runner=IncomingRunner:2:8
>> 24171 --runner=IncomingRunner:6:8
>> 24172 --runner=IncomingRunner:3:8
>> 24160 --runner=CommandRunner:0:1
>> 24161 --runner=OutgoingRunner:0:1
>> 24164 --runner=ArchRunner:0:1
>> 24170 /bin/python
>> 24159 /bin/python
>
>
> What are these last 2? Presumably they are the missing NewsRunner and
> RetryRunner, but what is the extra stuff in the ps output causing $11
> to be the python command and not the runner option? And again, why are
> these two, which presumably have done nothing, seemingly the biggest.
>
> Here's some additional thought.
>
> Are you sure there is an actual leak? Do you know that if you just let
> them run, they don't reach some stable size and remain there as
> opposed to growing so large that they eventually throw a MemoryError
> exception and get restarted by mailmanctl.
>
> If you allowed them to do that once, the MemoryError traceback might
> provide a clue.
>
> Caveat! I know very little about Python's memory management. Some of
> what follows may be wrong.
>
> Here's what I think - Python allocates more memory (from the OS) as
> needed to import additional modules and create new objects. Imports
> don't go away, but objects that are destroyed or become unreachable
> (eg a file object that is closed or a message object whose only
> reference gets assigned to something else) become candidates for
> garbage collection and ultimately the memory allocated to them is
> collected and reused (assuming no leaks). I *think* however, that no
> memory is ever actually freed back to the OS. Thus, Python processes
> that run for a long time can grow, but don't shrink.
>
> Now, IncomingRunner in particular can get very large if large messages
> are arriving, even if those messages are ultimately not processed very
> far. Incoming runner reads the entire message into memory and then
> parses it into a message object which is even bigger than the message
> string. So, if someone happens to send a 100MB attachment to a list,
> IncomingRunner is going to need over 200MB before it ever looks at the
> message itself. This memory will later become available for other use
> within that IncomingRunner instance, but I don't think it is ever
> freed back to the OS.
>
> Also, I see very little memory change between the 3 hour old snapshot
> above and the 8 hour old one from your prior post. If this is really a
> memory leak, I'd expect the 8 hour old ones to be perhaps twice as big
> as the 3 hour old ones.
>
> Also, do you have any really big lists with big config.pck files. If
> so, Runners will grow as they instantiate that (those) big list(s).
--
Fletcher Cocquyt
Senior Systems Administrator
Information Resources and Technology (IRT)
Stanford University School of Medicine
Email: fcocquyt at stanford.edu
Phone: (650) 724-7485
More information about the Mailman-Users
mailing list