Nowe posty

Autor Wątek: Problem z wolną pamięcią  (Przeczytany 7801 razy)

kubako

  • Gość
Problem z wolną pamięcią
« dnia: 2007-11-13, 13:19:01 »
witam

Mam problem z obsługą pamięci w linuksie. Chodzi o to, że cała pamięć jest zajmowana, i system zaczyna korzystać ze swapa, co znacznie spowalnia komputer.
Czytałem o zarządzaniu pamiącią w linuxie, i wszyscy piszą, że zajmowanie całej pamięci jest w porządku, bo system nie usuwa, starych, nieistotnych już informacji, dopuki nie ma takiej potrzeby. W porządku - tylko to nie działa w ten sposób :(

Komputer o którym mowa to serwer www, ma 1GB pamięci i działa na nim przede wszystkim apache z php (bez mysql, tzn mysql jest na innej maszynie)
Po uruchomieniu komputera mam praktycznie całą fizyczną pamięć wolną. Uruchamiam apacha i zostawiam system, żeby sobie działał.
Powoli ilość zajętej pamięci fizycznej rośnie, ma to sens zgodnie z zasadą, że niepotrzebne informacje są usuwane tylko wtedy gdy zajdzie taka potrzeba.
Zwykle po około miesiącu następuje moment krytyczny, to znaczy zajęta pamięć fizyczna osiąga maximum, a system zaczyna tworzyć swapa, co tragicznie spowalnia działanie komputera.
W takim momencie zabijam apacha. Ilość zajętej pamięci fizycznej momentalnie spada do jakiś 800 mega.
I teraz jak rozumiem, większość z tych 800mega, to powinny być "smieci" po działającym wcześniej, a zabitym apachu. Niestety po ponownym uruchomieniu apacha, system nie potrafi już skorzystać z tej pamięci i zachowuje się tak, jakby miał tylko te 200mega wolnego. Najpierw od razu zajmuje około 100 mega, a potem w trakcie działania serwera, w ciągu kilkunastu minut lub kilku godzin, zajmuje pozostałą wolną pamięć, co sprowadza się do ponownego zapisywania swapa i blokady komputera. I tak w kółko. Dopiero reboot pomaga, po po uruchomieniu mam znów dużo wolnej pamięci. Mniej więcej na miesiąc...

Teraz pytania:
- czemu system blokuje tyle pamięci nie wiadomo na co, i nie może jej udostępnić apachowi? Jak sprawdzić co zajmuje pamięć?
- co zrobić, żeby rozwiązać ten problem?
- czy jest możliwość aby wyczyścić pamięć bez reboota (raczej nie z tego co się zorientowałem)

--
kubako

chmooreck

  • Gość
Problem z wolną pamięcią
« Odpowiedź #1 dnia: 2007-11-13, 14:46:07 »
man top

To niekoniecznie system (w rozumieniu jajko) zajmuje tą pamięć... z tego, co napisałeś wydaje mi się, że jakiś program ma wyciek pamięci. Sprawdź najpierw co to za jeden tak się rozrasta.

kubako

  • Gość
Problem z wolną pamięcią
« Odpowiedź #2 dnia: 2007-11-20, 05:29:44 »
dzięki za odpowiedź

ten program to apache. tak jak napisałem w sytuacji, gdy zajmie całą pamięć muszę go zabić, lecz pamięć się nie zwalnia. zostaje wolny tylko mały kawłek który ponownie zostaje w całości wypełniony - i tak w kółko :/

chmooreck

  • Gość
Problem z wolną pamięcią
« Odpowiedź #3 dnia: 2007-11-20, 07:40:09 »
Sprawdź co zajmuje pamięć po zabiciu apache'a...

kubako

  • Gość
Problem z wolną pamięcią
« Odpowiedź #4 dnia: 2007-11-20, 15:00:22 »
no właśnie nic :/

przed zabiciem apacha mam
load avarage rzędu 50-60

a pamięć wygląda np tak:
Mem:   1024180k total,   996756k used,    27424k free,     1792k buffers
Swap:   522104k total,   218004k used,   304100k free,     6432k cached

i swap used gwałtownie rośnie

po zabiciu apacha pamięć wygląda tak:
Mem:   1024180k total,   788712k used,   235468k free,     2316k buffers
Swap:   522104k total,    10700k used,   511404k free,     9080k cached

Użyłem polecenia
ps ax o pid,command,pmem,rss,vsz --sort rss | tail
aby wylistować programy które zajmują pamięć, ale wyszło coś takiego:
15010 /usr/sbin/named   0.0  324 12876
 1055 /usr/sbin/named   0.0  324 12876
22396 /usr/sbin/named   0.0  324 12876
 7964 /usr/sbin/named   0.0  324 12876
13343 sshd: root@ttyp1  0.0  452  7316
21876 sshd: root@ttyp0  0.0  472  7480
24262 tail -n 30        0.0  504  4212
16692 ps ax o pid,comm  0.0  608  2196
31852 -bash             0.0  728  4344
21370 -bash             0.0  752  4344

jak widać same drobne rzeczy.

Po ponownym uruchomieniu apacha, potrafi skorzystać tylko z tych 235MB wolnej pamięci, a reszta jest niedostępna, zablokowana :(

Oczywiście szybko znów cała się zapycha. Nie wiem co jest grane.

Może jest jeszcze jakiś inny sposób na obejrzenie co siedzi w pamięci?

chmooreck

  • Gość
Problem z wolną pamięcią
« Odpowiedź #5 dnia: 2007-11-20, 15:25:45 »
puść to sobie bez tail'a...
proces wcale nie musi być duży... wystarczy, że jest ich wiele ;-)

ile masz procesów named ? (ps ax | grep named | wc -l)

kubako

  • Gość
Problem z wolną pamięcią
« Odpowiedź #6 dnia: 2007-11-20, 16:03:54 »
no niestety.
namedów mam 5szt, akurat wszystkie sie wylistowały

powyżej (bez taila) są jeszcze mniejsze procesy, około 50szt, ale wszystkie zajmuja mniej niz 1kB (przynajmniej dla wartosci rss)

dla vsz sa wieksze.

wkleilem wynik do excela i zsumowalem wartosci
wyszlo mi dla rss okolo 18000
a dla vsz okolo 350000

rozumiem ze zajeta rzeczywiscie pamiec powinna byc suma tych dwoch wartosci (rss i vsz), tak? czy niejako tylko vsz warto sprawdzać?

chmooreck

  • Gość
Problem z wolną pamięcią
« Odpowiedź #7 dnia: 2007-11-20, 17:11:51 »
oczywiście, że warto...

wydaje mi się, że takie masowe odpalanie procesów nie jest w porządku... sprawdź skąd one się biorą ;-)

No chyba, ze dalej chcesz mieć problem z pamięcią (jak nie po mieisącu, to po dwóch)

kubako

  • Gość
Problem z wolną pamięcią
« Odpowiedź #8 dnia: 2007-11-21, 03:35:11 »
dzięki za pomoc - generalnie cały czas drąże temat, sporo czytam, i coraz więcej rozumiem. wiem już co powoduje zajecie całej pamięci przez apache'a :)

ale wciąż nie znajduje odpowiedzi na proste pytanie - co po zabiciu apacha zajmuje ponad 800mega w pamięci?

wynik free:
             total       used       free     shared    buffers     cached
Mem:       1024180     870404     153776          0      20380      36608
-/+ buffers/cache:     813416     210764
Swap:       522104       4460     517644

lista procesów (ps ax o rss,vsz,command,pid --sort rss)
 RSS   VSZ COMMAND            PID
   0     0 [keventd]            2
   0     0 [ksoftirqd_CPU0]     3
   0     0 [kswapd]             4
   0     0 [bdflush]            5
   0     0 [kupdated]           6
   0     0 [mdrecoveryd]        7
   0     0 [kjournald]          8
   0     0 [kjournald]      14911
   4  1536 portmap          20986
   4  2012 xinetd -stayaliv 21707
   4  1860 dbus-daemon-1 -- 17566
   4  1380 /sbin/mingetty t    94
   4  1380 /sbin/mingetty t 16886
   4  1380 /sbin/mingetty t 16061
   4  1380 /sbin/mingetty t 30957
   4  1380 /sbin/mingetty t   738
   4  1380 /sbin/mingetty t 31738
   4  1392 /sbin/agetty tty 32248
  12  4288 /bin/bash /usr/l 22332
  16  1240 readproctitle se  5600
  28  4344 -bash            19174
  36  2048 /bin/sh /command 12013
  52  1384 qmail-lspawn ./M 22288
  76  1248 supervise log    32198
  80  1248 supervise qmail- 30726
  84  1248 supervise qmail- 13080
  84  1248 supervise log    16689
  96  1468 init [3]             1
  96  1388 /usr/local/bin/m    71
 104  1376 qmail-clean       6845
 120  1408 svscan /service  10444
 120  1448 /usr/local/bin/t 18252
 128  1388 /usr/local/bin/m 19686
 132  1384 qmail-rspawn     20121
 136  1508 crond            28177
 156  1444 mdadm --monitor   5116
 160  1416 qmail-send       23045
 168  1496 /usr/sbin/atd     9953
 204  1456 syslogd -m 0     15417
 248  1708 /usr/sbin/smartd  1625
 248  4304 proftpd: (accept 27178
 336  3656 /usr/sbin/sshd   30397
 608  2196 ps ax o rss,vsz,  7220
 620  1952 top d 1          13443
 692  7480 sshd: root@ttyp0 28955
 776  4344 -bash            10349
 808  7476 sshd: root@ttyp1 28918
 972 12876 /usr/sbin/named  13839
 972 12876 /usr/sbin/named  15010
 972 12876 /usr/sbin/named   1055
 972 12876 /usr/sbin/named  22396
 972 12876 /usr/sbin/named   7964
 976  4292 /bin/sh /opt/mys 17900
1348  4344 -bash            20172
1936  7316 sshd: root@ttyp2 16148
4688 65412 /opt/mysql-5.0.2 32486
4688 65412 /opt/mysql-5.0.2 26280
4688 65412 /opt/mysql-5.0.2 23026

jakbym nie liczył to wychodzi mi mniej niz 400mega - czemu więc zajęte jest ponad 800?

chmooreck

  • Gość
Problem z wolną pamięcią
« Odpowiedź #9 dnia: 2007-11-21, 07:46:21 »
to masz jeszcze jedną lekturę:
http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html
może już czytałeś...

P.S. Fajnie by było (jednocześnie jest to prośba) jakbyś po rozwiązaniu problemu znalazł chwilkę i podsumował ten wątek ;-)

kubako

  • Gość
Problem z wolną pamięcią
« Odpowiedź #10 dnia: 2007-11-21, 12:17:18 »
Dzięki za link.
Już o tym czytałem - nie tutaj, ale mniej więcej rozumiem opisaną tam zasadę.

W skrócie - wartość pamięci podana przez ps dla poszczególnych procesów może być zawyżona, ponieważ korzystają one z shared libraries (wspólnych bibliotek) - przykładowo jeśli 10 procesów httpd zajmuje po 10mega, naprawdę każdy z nich może zajmować powiedzmy 1mega a 9mega to właśnie współdzielona biblioteka, wgrana do pamięci tylko raz dla wszystkich procesów. Czyli zamiast 10x10mega, httpd na prawdę zajmuje 1x10+9mega.

To wszystko dla mnie jest jasne. Ale mój problem jest odwrotny!

Ja mam w ps wylistowane łącznie 10 procesów po 10mega (powiedzmy) ale w pamięci nie mam 100 mega zajęte, ani 19mega, tylko 500!
I nie jest to pamięć zajęta przez bufor, tylko przez procesy (wynika to z polecenia free).

chmooreck

  • Gość
Problem z wolną pamięcią
« Odpowiedź #11 dnia: 2007-11-21, 12:52:15 »
-/+ buffers/cache:     813416     210764 ??
Nie oznacza to czasem, że 800 MB jest zajmowane przez bufory i cache ?

kubako

  • Gość
Problem z wolną pamięcią
« Odpowiedź #12 dnia: 2007-11-21, 14:05:39 »
czytałem o tym na innym forum:
http://www.linux.com.pl/forum/index.php?t=msg&goto=309046&rid=0&S=9463468b79d7fe149123dc8bfed55e73

wg informacji które tam podali w linijce
-/+ buffers/cache:     813416     210764

813mega oznacza ilosc pamieci zajetej przez procesy, a 210 to bufory, który może być uzyty przez aplikacje.
To samo piszą np tutaj:
http://gentoo-wiki.com/FAQ_Linux_Memory_Management