Site güncellemesini takiben haftada bir kez ziyaretçilerde büyük bir artış yaşayan nispeten düşük trafikli bir site çalıştırıyorum. Bu artış sırasında, site performansı haftanın geri kalanına kıyasla son derece zayıf. Sunuculardaki gerçek yük çok düşük, güvenilir olarak% 10 CPU ve% 30 RAM'in altında kalıyor (donanım aslında yaptığımız şey için tam bir overkill olmalı), ancak bir nedenle Apache miktarla baş edemiyor gibi görünüyor isteklerin. RHEL 5.7, çekirdek 2.6.18-274.7.1.el5, x86_64 üzerinde apache 2.2.3 çalıştırıyoruz.
Bu davranışı ab ile çalışma saatleri dışında yeniden oluşturmaya çalışırken, yaklaşık 256 kullanıcıyı aşarken performansta büyük bir düşüş görüyorum. Sınava gelebildiğim en küçük kullanım örneğiyle (statik metin dosyası alınıyor, toplamda 223 bayt) performans çalıştırmak, 245 eşzamanlı istekle sürekli olarak normaldir:
Connection Times (ms)
min mean[+/-sd] median max
Connect: 15 25 5.8 24 37
Processing: 15 65 22.9 76 96
Waiting: 15 64 23.0 76 96
Total: 30 90 27.4 100 125
Percentage of the requests served within a certain time (ms)
50% 100
66% 108
75% 111
80% 113
90% 118
95% 120
98% 122
99% 123
100% 125 (longest request)
Ancak 265'e kadar eşzamanlı isteği cırcırla çevirdiğimde, bir alt kümesinin tamamlanması saçma bir zaman almaya başlar:
Connection Times (ms)
min mean[+/-sd] median max
Connect: 13 195 692.6 26 3028
Processing: 15 65 21.3 72 100
Waiting: 15 65 21.3 71 99
Total: 32 260 681.7 101 3058
Percentage of the requests served within a certain time (ms)
50% 101
66% 108
75% 112
80% 116
90% 121
95% 3028
98% 3040
99% 3044
100% 3058 (longest request)
Bu sonuçlar çoklu çalışmalarda çok tutarlıdır. Bu kutuya giden başka bir trafik olduğundan, eğer varsa, zor kesimin nerede olacağından emin değilim, ancak şüphesiz 256'ya yakın görünüyor.
Doğal olarak, bunun preforktaki iplik sınırından kaynaklandığını varsaydım, bu yüzden devam ettim ve mevcut iş parçacıklarının sayısını iki katına çıkarmak ve iş parçacığı havuzunun gereksiz yere büyümesini ve küçülmesini önlemek için yapılandırmayı ayarladım:
<IfModule prefork.c>
StartServers 512
MinSpareServers 512
MaxSpareServers 512
ServerLimit 512
MaxClients 512
MaxRequestsPerChild 5000
</IfModule>
mod_status artık 512 kullanılabilir iş parçacığıyla çalıştığımı onaylıyor
8 requests currently being processed, 504 idle workers
Bununla birlikte, 265 eşzamanlı istekte bulunmaya çalışmak, daha önce neredeyse aynı sonuçları verir.
Connection Times (ms)
min mean[+/-sd] median max
Connect: 25 211 714.7 31 3034
Processing: 17 94 28.6 103 138
Waiting: 17 93 28.5 103 138
Total: 57 306 700.8 138 3071
Percentage of the requests served within a certain time (ms)
50% 138
66% 145
75% 150
80% 161
90% 167
95% 3066
98% 3068
99% 3068
100% 3071 (longest request)
Dokümanları (ve Stack Exchange) inceledikten sonra, bu darboğazın üstesinden gelmeye çalışmak için daha fazla yapılandırma ayarının kaybına uğradım. Kaçırdığım bir şey var mı? Apache dışında cevap aramaya başlamalı mıyım? Başka kimse bu davranışı gördü mü? Herhangi bir yardım büyük mutluluk duyacağız.
DÜZENLE:
Ladadadada'nın tavsiyesine göre apache'ye karşı koştum. -Tt ve -T ile birkaç kez denedim ve sıradan bir şey bulamadım. Daha sonra şu anda çalışan tüm apache işlemlerine karşı strace -c çalıştırmayı denedim ve bunu aldım:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
22.09 0.317836 5 62128 4833 open
19.91 0.286388 4 65374 1896 lstat
13.06 0.187854 0 407433 pread
10.70 0.153862 6 27076 semop
7.88 0.113343 3 38598 poll
6.86 0.098694 1 100954 14380 read
(... abdridged)
Bu hakkı okuyorsam (ve sık sık kullanmıyorum gibi benimle taşıyorsam), sistem çağrılarının hiçbiri bu isteklerin aldığı süreyi açıklayamaz. Neredeyse darboğaz, talepler işçi iş parçacıklarına ulaşmadan gerçekleşiyor gibi görünüyor.
DÜZENLEME 2:
Birkaç kişinin önerdiği gibi, testi tekrar web sunucusunda yürüttüm (daha önce test tarafsız bir internet konumundan çalıştırıldı). Sonuçlar şaşırtıcıydı:
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 11 6.6 12 21
Processing: 5 247 971.0 10 4204
Waiting: 3 245 971.3 7 4204
Total: 16 259 973.3 21 4225
Percentage of the requests served within a certain time (ms)
50% 21
66% 23
75% 24
80% 24
90% 26
95% 4225
98% 4225
99% 4225
100% 4225 (longest request)
Sonuç olarak internet tabanlı teste benzer, ancak yerel olarak çalıştırıldığında sürekli olarak biraz daha kötü görünüyor . Daha ilginç olarak, profil önemli ölçüde değişti. Halbuki uzun süredir devam eden taleplerin büyük bir kısmı “bağlan” için harcanmadan önce, şimdi darboğaz işleniyor ya da bekliyor gibi görünüyor. Bunun aslında daha önce ağ sınırlamaları tarafından maskelenen ayrı bir sorun olabileceğinden şüpheleniyorum.
Testi tekrar Apache ana bilgisayarıyla aynı yerel ağdaki başka bir makineden çalıştırdığımda çok daha makul sonuçlar görüyorum:
Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 2 0.8 2 4
Processing: 13 118 99.8 205 222
Waiting: 13 118 99.7 204 222
Total: 15 121 99.7 207 225
Percentage of the requests served within a certain time (ms)
50% 207
66% 219
75% 220
80% 221
90% 222
95% 224
98% 224
99% 225
100% 225 (longest request)
Bu iki test birlikte bir dizi soruyu gündeme getirmektedir, ancak bundan ayrı olarak, artık belirli bir yük altında gerçekleşen bir tür ciddi ağ darboğazının yapılması için zorlayıcı bir durum söz konusudur. Sonraki adımların ağ katmanını ayrı ayrı araştıracağını düşünüyorum.