Jak znaleźć źródło zwiększającego się wykorzystania pamięci skręconego serwera?

Mam serwer nadawczy audio napisany w Pythonie i oparty na Twisted. Działa dobrze, ale jego użycie pamięci wzrasta, gdy na serwerze jest więcej użytkowników, ale użycie pamięci nigdy nie spada, gdy użytkownicy się wyłączają. Jak widać na poniższym rysunku:alt text http://static.ez2learn.com/temp/mem_figure3.svg

Widać, że krzywa wykorzystania pamięci rośnie, gdy krzywa słuchaczy / radioodbiorników rośnie, ale po szczycie słuchacza / radia zużycie pamięci jest nadal wysokie, nigdy nie spada.

Wypróbowałem następującą metodę rozwiązania tego problemu:

Uaktualnij Skręcone z 8.2 do 9.0Użyj gupika, żeby zrzucić heapy, ale w ogóle nie pomagaPrzełącz reaktor selektora na reaktor epoll, ten sam problem.Użyj objgraph, aby narysować diagram relacji obiektów, ale nie widzę z tego punktów.

Oto środowisko, w którym korzystałem z mojego skręconego serwera:

Python: 2.5.4 r254: 67916OS: Linux wersja 2.6.18-164.9.1.el5PAE ([email protected]) (gcc wersja 4.1.2 20080704 (Red Hat 4.1.2-46))Twisted: 9.0 (under virtualenv)

Wysypisko gupika:

Partition of a set of 116280 objects. Total size = 9552004 bytes.
 Index  Count   %     Size   % Cumulative  % Type
  0  52874  45  4505404  47   4505404  47 str
  1   5927   5  2231096  23   6736500  71 dict
  2  29215  25  1099676  12   7836176  82 tuple
  3   7503   6   510204   5   8346380  87 types.CodeType
  4   7625   7   427000   4   8773380  92 function
  5    672   1   292968   3   9066348  95 type
  6    866   1    82176   1   9148524  96 list
  7   1796   2    71840   1   9220364  97 __builtin__.weakref
  8   1140   1    41040   0   9261404  97 __builtin__.wrapper_descriptor
  9   2603   2    31236   0   9292640  97 int

Jak widać, łączny rozmiar 9552004 bajtów to9,1 MBi możesz zobaczyć rss zgłaszany przez komendę ps:

[xxxx@webxx ~]$ ps -u xxxx-o pid,rss,cmd
  PID   RSS CMD
22123 67492 twistd -y broadcast.tac -r epoll

RSS mojego serwera to65,9 MB, to znaczy, że są56,8 MB niewidzialne użycie pamięci na moim serwerze, czym one są?

Moje pytania to:

Jak znaleźć źródło zwiększającego się wykorzystania pamięci?Co to jest użycie pamięci widocznej dla gupika?Jakie są te niewidzialne użycie pamięci?Czy jest to spowodowane wyciekami pamięci niektórych modułów napisanych w C? Jeśli tak, jak mogę to śledzić i naprawić?Jak Python zarządza pamięcią? Pula pamięci? Myślę, że może to być spowodowane fragmentami danych audio. Tak więc w pliku pamięci Pythona nie ma zbyt wielu przecieków.

Aktualizacja 2010/1/20: To interesujące, ściągam najnowszy plik dziennika i pokazuje, że pamięć nigdy nie wzrasta. Myślę, że przydzielona przestrzeń pamięci jest wystarczająco duża. Oto najnowszy rysunek.alt text http://static.ez2learn.com/temp/mem_figure4.svg

Aktualizacja 2010/1/21: Kolejna postać tutaj. buczenie .... podnieś się trochęalt text http://static.ez2learn.com/temp/mem_figure6.svg

Ups ... Nadal w górzealt text http://static.ez2learn.com/temp/mem_figure7.svg

questionAnswers(3)

yourAnswerToTheQuestion