Seçeneğini kullanarak Basit TCP sunucusu (), neden "uzun isteği" dir

3 Cevap php

Ben select () yöntemini kullanarak basit bir TCP sunucusu uyguluyorsanız am - her şey gayet iyi ve performansı oldukça kabul edilebilir, ama ab (apachebench) ile kıyaslama yaparken "uzun isteği" ortalama zamanlara göre delicesine yüksek:

Ben kullanıyorum: ab -n 5000 -c 20 http://localhost:8000/

pasajı:

Requests per second:    4262.49 [#/sec] (mean)
Time per request:       4.692 [ms] (mean)
Time per request:       0.235 [ms] (mean, across all concurrent requests)

Percentage of the requests served within a certain time (ms)
  50%      2
  66%      2
  75%      2
  80%      2
  90%      2
  95%      3
  98%      3
  99%      4
 100%    203 (longest request)

ve apache karşı aynı:

Requests per second:    5452.66 [#/sec] (mean)
Time per request:       1.834 [ms] (mean)
Time per request:       0.183 [ms] (mean, across all concurrent requests)

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      2
  75%      2
  80%      2
  90%      3
  95%      3
  98%      4
  99%      4
 100%      8 (longest request)

Başvuru için, i stream_socket_recvfrom kullanıyorum ve prizler olmayan engelleme vardır.

Is this a common effect of using the select() call?
Are there any kinds of performance considerations i should worry about?

Update:

Bir eşzamanlılık değeri <= 6 kullanırken, uzun isteği (yaklaşık 2x veya ortalama 3x) "normal" olduğunu, ancak 6 yukarıdaki şey sadece (örneğin, 7 eşzamanlı istekleri 20 veya etrafında 200ms gibi aynı kriter olabilir delirir .)

Update2:

Eşdeğer soket fonksiyonları ve bazı uygun test / kıyaslama ile akım fonksiyonları değiştirdikten sonra, sorun artık ortaya - bu yüzden dere PHP uygulanmasına ilişkin bazı karanlık ayrıntı için bu davranışı bağlar.

3 Cevap

200ms bir zamanlayıcı zaman kuantum gibi geliyor.

Sadece emin olmak için, select NULL veya sıfır zaman aşımı kullanıyorsunuz? Sadece okuma için hazır prizler, ya da tam tersi için yazıyoruz? Yeniden seçin çağırmadan önce döner seçeneğini her fd işliyoruz? Bazı kod görmek gerçekten güzel olurdu ...

Ben localhost karşı test ediyoruz eğer ağ olacağını sanmıyorum. Ama Reinier doğru, bazı TCP yeniden iletim (200ms makul modern bir linux asgari TCP yeniden aktarım zaman aşımı) olsaydı görürdünüz ne çok benziyor.

Eğer tcp-ip trafiğini izlemek için wireshark ya da başka bir algılayıcı kullanabilirsiniz. Bu şekilde sorun düşük seviyeli sorunları ile ilgisi olup olmadığını görmek (yeniden iletilmesine, packetloss, vb) olabilir

Isteklerinin% 99 sadece 4ms olarak tamamladıktan olduğundan, bir DNS araması veya diskten sizin kod büyük miktarda takas gibi, bir seferlik maliyet töhmet eğiliminde olacaktır.