Cache'owanie plików w pamięci Apache'a

Mój Apacz zaczyna krztusić się przy około 80 zapytaniach na sekundę (nie wiem czy to wysoka/niska wartość jak dla sprzętu z 8 rdzeniami i 8GB RAM), doszedłem do tego, że prawdopodobnie nie wydala dysk twardy z odczytywaniem serwowanych plików w takim tempie. Próbuję więc wrzucić wszystkie pliki aplikacji (katalog /public) do RAMu.

Włączyłem mody cache i file_cache (a2enmod cache file_cache), ustawiłem config i… niestety nie działa. Tzn. po włączeniu Apache i usunięciu przykładowego cache’owanego obrazka, powinien się on dalej wczytywać.

Czy ktoś bawił się już tym modem do Apache?

Dokumentacja modułu: http://httpd.apache.org/docs/2.2/mod/mod_file_cache.html

A tu mój config:

<VirtualHost *:80> ServerName www.domena.pl DocumentRoot /home/rails/domena.pl/public <Directory /home/rails/domena.pl/public> AllowOverride all Options -MultiViews </Directory> MMapFile "/home/rails/domena.pl/public/favicon.gif" MMapFile "/home/rails/domena.pl/public/422.html" ... </VirtualHost>

Jestem w stanie założyć się, że ten cały mod_cache absolutnie nic Ci nie da. To nie jest tak, że za każdym razem taki plik jest odczytywany z dysku. Na jednym z serwerów w firmie serwujemy do 5MB/s i dstat pokazuje odczyt z dysku = 0 (zero). Dlaczego? Dlatego, że cały serwowany kontent mieści się w pamięci RAM i system sobie to sam keszuje (pamięć wirtualna).

Pytanie jest takie: czy te 80req/s to większość do plików statycznych? Jak duże są te pliki. Co pokazuje dstat? Wątpię by problemem był dysk, chyba że macie jakieś słabe I/O. Jak z loadem na serwerze? "doszedłem do tego, że prawdopodobnie " - nie zgadujemy, tylko mierzymy, mierzymy, wyciągamy wnioski a potem dopiero zabieramy się za działanie.

Nie bawiłem się ale widzę inne rozwiązanie. Można pokusić się o podmontowanie sobie tmpfs (zakładam że to Linux) i trzymanie tam plików serwowanych przez Apache. Trzeba tylko je jakoś synchronizować z lokalnym systemem plików (rsync via cron?). Powinno działać.

Pewność będę miał gdy aplikacja zacznie znowu chodzić znośnie. :stuck_out_tongue:

Tak, 95% to pliki statyczne.

Największe mają 100kb, średnia to 10kb.

----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 4 1 94 0 0 0| 12M 7142k| 0 0 | 0 2.2B|1009 1631 16 1 83 0 0 0| 0 944k| 130k 672k| 0 0 |1642 2981 0 0 99 0 0 0| 0 1248k| 65k 482k| 0 0 |1138 622 8 0 92 0 0 0| 0 720k| 24k 297k| 0 0 | 818 1146 12 1 87 0 0 0| 16k 4560k| 42k 385k| 0 0 |1176 3244 15 1 84 0 0 0|8192B 6112k| 66k 638k| 0 0 |1646 7535 15 1 83 0 0 0| 16k 5264k| 122k 1013k| 0 0 |2079 4002 16 1 82 0 0 0| 0 3408k| 126k 1019k| 0 0 |2061 3717 3 0 96 0 0 1| 0 0 | 143k 1742k| 0 0 |2308 960 3 0 96 0 0 0| 0 1456k| 115k 1126k| 0 0 |1953 1712 17 1 82 0 0 0| 16k 5008k| 135k 1500k| 0 0 |2475 6050 7 1 91 0 0 1|8192B 600k| 212k 2237k| 0 0 |3068 2403 4 0 95 0 0 0| 0 8192B| 96k 936k| 0 0 |1762 2174 10 1 86 3 0 0| 16k 3392k| 70k 492k| 0 0 |1389 3101 1 0 99 0 0 0| 0 896k| 106k 691k| 0 0 |1493 719 8 0 92 0 0 0|8192B 1024k| 87k 270k| 0 0 |1107 1716 3 0 96 0 0 0| 0 4688k| 68k 418k| 0 0 |1459 1002 11 1 88 0 0 0|8192B 11M| 62k 480k| 0 0 |1471 2529 7 1 92 0 0 0| 0 160k| 74k 483k| 0 0 |1338 2354 1 0 99 0 0 0| 0 32k| 72k 527k| 0 0 |1174 628 6 1 93 0 0 0| 0 2048k| 54k 429k| 0 0 |1165 2205 7 0 92 0 0 0|8192B 3984k| 93k 589k| 0 0 |1485 2321 5 1 94 0 0 0|8192B 2400k| 95k 744k| 0 0 |1617 1394 9 1 90 0 0 0| 0 96k| 56k 389k| 0 0 |1137 2317 6 0 93 0 0 0| 0 4520k| 56k 518k| 0 0 |1251 2159 17 1 82 0 0 0|8192B 1528k| 42k 445k| 0 0 |1270 3819 11 2 86 0 0 0| 0 240k| 41k 519k| 0 0 |1258 2479
Tak wygląda dstat gdy strona bardzo muli.

1.48, 1.39, 1.14
Obciążenie procka było problemem wcześniej, poprawiłem cache i procek nie jest już obciążony mocno.

Będę wdzięczny za wszystkie sugestie, co tu może być nie tak. :slight_smile:

Jak widać:

  • dysk się nudzi
  • procek się nudzi
  • reszta w porządku

Tak na szybko to na początek polecam zjechać z domyślnym Keep Alive. Bodajże jest 90s. Zjedź do 15s. Za kilka miesięcy jak urośnie Ci ruch zgłoś się do mnie - dostaniesz dalszą część instrukcji. Póki co będziesz mógł spać spokojnie ;-).

EDIT

Jedyne co mnie ew. zastanawia to zapis na dysku. Skąd te 5-6MB zapisu momentami?

W configu Apache mam:

KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15
więc tego nie ruszałem.

Faktycznie, dziwny jest tak duży zapis na dysk. To pewnie jest źródło problemów z serwowaniem plików przez Apache.

Przyjrzałem się procesom w iotop, najwięcej zapisuje mysql i kjournald:

atop pokazuje, że najwięcej zapisuje jednak kjournald (nie wiem dlaczego nie ma na liście mysql’a):

PID RDDSK WRDSK WRDSK_CANCEL DSK CMD 1/9 1611 136K 14.6G 0K 96% kjournald 3972 684K 472.5M 244.4M 3% freshclam 3535 108.5M 100K 0K 1% pol 18346 88K 8008K 420K 0% amavisd-new 279 0K 3916K 0K 0% pdflush 278 0K 3456K 0K 0% pdflush 3468 1600K 868K 8K 0% amavisd-new 12509 84K 2180K 0K 0% sftp-server 1 1704K 24K 0K 0% init 6694 224K 832K 0K 0% tlsmgr 20426 12K 928K 48K 0% amavisd-new 18761 660K 48K 0K 0% atop 4138 156K 340K 0K 0% saslauthd 4139 132K 308K 0K 0% saslauthd 3870 0K 388K 0K 0% clamd 3820 0K 380K 344K 0% smtp 4137 36K 296K 0K 0% saslauthd 4136 4K 288K 0K 0% saslauthd 4140 36K 256K 0K 0% saslauthd 4114 232K 0K 5124K 0% qmgr 4745 196K 8K 0K 0% fail2ban-serve 19807 0K 164K 68K 0% local 5679 112K 16K 0K 0% screen
Tak więc albo problemem jest journal ext3, albo coś z mysql’em (ale nie mam pojęcia co). Jutro się temu jeszcze przyjrzę.

Dzięki za wskazówki. :slight_smile:

Faktycznie dziwne, ale mimo wszystko wydaje mi się, że nie powinno to aż tak zamulać serwera (biorąc pod uwagę, że większość żądań to pliki statyczne, które i tak są keszowane przez kernel w pamięci). Zjedź z Keep Alive do 5 (albo go na chwilę wyłącz) i zobacz czy to cokolwiek zmienia.

Zobacz jeszcze na to: http://ubuntuforums.org/showthread.php?t=369759 (“kjournald constantly accessing disk”).

Ups, nie zauważyłem wcześniej Twojego posta. Odczytywanie plików jednak nie jest problemem.

Zobaczymy wieczorem, czy pomoże.

Próbowałem, ale to jednak wina mysql’a. Kjournald aktualizuje dziennik pewnie głównie przez to co zapisuje mysql. W atop nie widać mysql’a, dlatego, że jego procesy działają 1 sekundę i się kończą. Ale to głównie mysql obciąża dysk, gdy go wyłączę, to zapis tak nie szaleje. W mysql nie zapisuję nic szczególnego, parę razy na sekundę zapisywana jest komórka z datą albo intem. Tym tropem będę póki co podążał.

EDIT: Dzisiaj jest nieco lepiej, pewnie pomogła redukcja KeepAlive w Apache. Dorzucam jeszcze dwa logi z dstat’a w godzinie szczytu.
Aplikacja wyłączona (Apache obsługuje parę stron o małym ruchu):

----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 4 0 96 0 0 0| 55k 1819k| 0 0 | 0 0 | 953 899 0 0 100 0 0 0| 0 624k| 15k 102k| 0 0 | 392 212 0 0 100 0 0 0| 0 32k|4471B 8001B| 0 0 | 129 108 0 0 100 0 0 0| 0 0 |3259B 2052B| 0 0 | 126 92 0 0 100 0 0 0| 0 0 |4972B 3015B| 0 0 | 109 97 0 0 100 0 0 0| 0 256k|8636B 10k| 0 0 | 204 156 0 0 100 0 0 0| 0 32k| 18k 11k| 0 0 | 270 188 0 0 100 0 0 0| 0 448k| 11k 7054B| 0 0 | 273 186 0 0 100 0 0 0| 0 0 |4894B 3367B| 0 0 | 149 117 3 0 97 0 0 0| 0 0 | 10k 5893B| 0 0 | 304 340 1 0 99 0 0 0| 0 1136k|2596B 10k| 0 0 | 249 162 0 0 100 0 0 0| 0 32k|7280B 4095B| 0 0 | 139 122 0 0 100 0 0 0| 0 672k|4888B 2800B| 0 0 | 197 176 0 0 100 0 0 0| 0 0 |7347B 4736B| 0 0 | 198 134 0 0 100 0 0 0| 0 0 | 13k 13k| 0 0 | 222 160 0 0 100 0 0 0| 0 656k|5664B 3418B| 0 0 | 166 117 0 0 100 0 0 0| 0 32k|8579B 10k| 0 0 | 179 136 0 0 100 0 0 0| 0 416k| 13k 13k| 0 0 | 234 182 0 0 100 0 0 0| 0 0 |8760B 4191B| 0 0 | 160 135 0 0 100 0 0 0| 0 0 |8130B 15k| 0 0 | 167 132 0 0 100 0 0 0| 0 0 |9178B 6217B| 0 0 | 236 164 0 0 100 0 0 0| 0 0 | 10k 13k| 0 0 | 262 148 0 0 100 0 0 0| 0 368k|6931B 5018B| 0 0 | 210 180 0 0 100 0 0 0| 0 0 |5775B 4343B| 0 0 | 162 119 0 0 100 0 0 0| 0 0 |8356B 5288B| 0 0 | 177 134 0 0 100 0 0 0| 0 0 |5048B 3825B| 0 0 | 159 117 0 0 100 0 0 0| 0 0 |4861B 12k| 0 0 | 159 135 0 0 100 0 0 0| 0 400k|6057B 4247B| 0 0 | 179 151 0 0 100 0 0 0| 0 0 |5588B 8717B| 0 0 | 185 131 3 1 95 1 0 0|8192B 3728k|6264B 5105B| 0 0 | 854 1350 0 0 100 0 0 0| 0 32k|5567B 3492B| 0 0 | 171 147 0 0 100 0 0 0| 0 0 |4708B 3495B| 0 0 | 145 104 0 0 100 0 0 0| 0 0 | 11k 6411B| 0 0 | 179 135 0 0 100 0 0 0| 0 0 |5701B 3711B| 0 0 | 143 118 0 0 100 0 0 0| 0 0 |2980B 2766B| 0 0 | 182 138 0 0 100 0 0 0| 0 784k|5557B 3504B| 0 0 | 226 213 0 0 100 0 0 0| 0 32k|1892B 1268B| 0 0 | 94 100 0 0 100 0 0 0| 0 0 |3575B 8785B| 0 0 | 155 132 0 0 100 0 0 0| 0 0 |2709B 2723B| 0 0 | 153 125 0 0 100 0 0 0| 0 0 |3626B 7447B| 0 0 | 151 108 0 0 100 0 0 0| 0 480k|2221B 1637B| 0 0 | 153 159 6 1 93 0 0 0| 0 32k|7623B 21k| 0 0 | 439 1811 0 0 100 0 0 0| 0 0 |1870B 1365B| 0 0 | 121 118
Aplikacja włączona:

usr sys idl wai hiq siq| read writ| recv send| in out | int csw 4 0 96 0 0 0| 55k 1820k| 0 0 | 0 0 | 952 899 13 1 86 0 0 0| 0 8240k| 105k 895k| 0 0 |1917 2092 12 0 87 0 0 0| 0 864k| 144k 1210k| 0 0 |1978 1625 1 0 97 0 1 1| 0 1024k| 221k 1799k| 0 0 |2527 1217 1 0 97 0 0 1| 0 0 | 152k 1762k| 0 0 |2267 745 2 0 98 0 0 0| 0 0 | 74k 568k| 0 0 |1185 553 9 2 88 0 0 0| 0 4304k| 78k 553k| 0 0 |1581 2171 8 0 91 1 0 0| 16k 3504k| 99k 757k| 0 0 |1647 1590 2 0 98 0 0 0| 0 960k| 93k 753k| 0 0 |1409 663 0 0 99 0 0 0| 0 448k| 47k 494k| 0 0 | 922 386 9 0 90 0 0 0| 0 512k| 34k 503k| 0 0 |1012 1195 3 0 95 0 0 0| 0 7808k| 106k 1375k| 0 0 |2120 1095 5 0 94 0 0 0| 0 736k| 93k 893k| 0 0 |1688 1061 0 0 99 0 0 0| 0 0 | 68k 636k| 0 0 |1192 463 1 0 99 0 0 0| 0 0 | 60k 660k| 0 0 |1195 490 9 1 90 0 0 0| 0 1408k| 56k 648k| 0 0 |1480 1826 4 1 95 0 0 0|8192B 4576k| 78k 875k| 0 0 |1850 1409 0 0 100 0 0 0| 0 32k| 82k 1281k| 0 0 |1561 505 5 0 94 0 0 0| 0 864k| 67k 673k| 0 0 |1217 806 9 0 90 0 0 0| 0 800k| 102k 904k| 0 0 |1651 1284 15 1 82 0 0 0| 0 928k| 139k 1554k| 0 0 |2287 1719 5 0 94 0 0 1| 0 7312k| 135k 1737k| 0 0 |2424 1128 10 0 89 0 0 0| 0 848k| 109k 1510k| 0 0 |2050 1410 1 0 98 0 0 1| 0 640k| 151k 1693k| 0 0 |2237 795 2 0 97 0 0 0| 0 448k| 58k 986k| 0 0 |1359 644 9 0 90 0 0 0| 0 560k| 88k 1135k| 0 0 |1712 1117 9 0 90 0 0 0| 0 640k| 103k 1038k| 0 0 |1825 1161 6 0 93 0 0 0| 0 624k| 116k 1653k| 0 0 |2148 1011 1 0 98 0 0 0| 0 608k| 114k 1086k| 0 0 |1746 701 5 0 94 0 0 0| 0 608k| 108k 1116k| 0 0 |1824 769 7 0 92 0 0 0| 0 56k| 168k 1336k| 0 0 |2132 1096 6 0 93 0 0 1| 0 792k| 149k 1510k| 0 0 |2277 1053 8 0 90 0 0 1| 0 10M| 191k 1413k| 0 0 |2455 1681 2 0 98 0 0 0| 0 1792k| 171k 930k| 0 0 |1865 787 10 0 89 0 0 0| 0 704k| 110k 841k| 0 0 |1511 1042 16 1 83 0 0 0| 0 752k| 139k 1222k| 0 0 |2033 1571 19 1 79 0 0 1| 0 1072k| 168k 1943k| 0 0 |2584 2036 5 0 94 0 0 0| 0 864k| 186k 1569k| 0 0 |2377 1284 9 0 90 0 0 0| 0 736k| 144k 1232k| 0 0 |2125 1517 11 0 88 0 0 0| 0 1024k| 199k 1744k| 0 0 |2606 1630 2 0 97 0 0 1| 0 1088k| 153k 1554k| 0 0 |2126 725 2 0 97 0 0 0| 0 0 | 123k 1082k| 0 0 |1714 563 9 0 90 0 0 0| 0 13M| 99k 853k| 0 0 |1840 1452 9 0 91 0 0 0| 0 800k| 140k 1025k| 0 0 |1812 1410
Łącze jest używane w ok. 15%, RAM jest w połowie wolny. Gdy do czegoś dojdę / rozwiążę problem, dam znać. :slight_smile:

No i jak doszedłeś co było problemem? :slight_smile:

No i jak doszedłeś co było problemem? :)[/quote]
Dysk nie wydalał, pomogło przeniesienie bazy na osobną maszynę i zamiana Apache na Nginx.