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