2016-04-05 13 views
3

Diğer apislerin bir http istemcisi olan küçük bir sunucu var. Kullandığım bir kitaplık bağımlı olarak httplib var.Bloke ağ IO kullanıp kullanmadığını test etmek için gevent bir uygulamadan strace çıktısında ne grep olabilir?

monkey.patch_all dosyasını yapıyorum. Disk yok, sadece ağ.

Sistem çağrılarımda paslıyım, ancak çağrıların strace kullanılarak engellenip engellenmediğini test etmenin basit bir yolu olup olmadığını merak ediyordum.

Strace'i nasıl kullanacağımı biliyorum ama ne için grep olabileceğimi bilmiyorum.

Bu işe yarar mı?

Teşekkür

cevap

1

bir biraz tecrübe önde kendim gittim ve en azından kısmi bir cevap buldum.

Sadece 5 saniye uyuyan ve sonra 'merhaba' yanıt veren bir web sitesi hazırladım.

Daha sonra iki müşteri yazdım. Birisi python isteklerini kullanır, diğeri grequests (bir zamanuyumsuz istek modülü) kullanır.

İlk istemci:

import requests 

resp = requests.get('http://localhost:1234') 

İkinci istemci:

from gevent import monkey; monkey.patch_all() 
import grequests 

req = grequests.get('http://localhost:1234') 
resp = grequests.map([req])[0] 

Bunları olarak ran: (beklenen) engelleme versiyonunun çıktısında

strace -T -f -s1000 python blocking_io.py &> out 

, alıyorum:

sendto(3, "GET/HTTP/1.1\r\nHost: localhost:1234\r\nConnection: keep-alive\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nUser-Agent: python-requests/2.9.1\r\n\r\n", 144, 0, NULL, 0) = 144 <0.000022> 
fcntl(3, F_GETFL)      = 0x2 (flags O_RDWR) <0.000008> 
fcntl(3, F_SETFL, O_RDWR)    = 0 <0.000007> 
recvfrom(3, "HTTP/1.0 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 12\r\n", 8192, 0, NULL, NULL) = 77 <5.009440> 
recvfrom(3, "Server: Werkzeug/0.11.5 Python/2.7.10\r\nDate: Tue, 05 Apr 2016 22:28:38 GMT\r\n\r\nHello World!", 8192, 0, NULL, NULL) = 90 <0.000067> 
close(3)        = 0 <0.000175> 

İlk recvfrom için satırın sonundaki 5 saniye bekleme süresine dikkat edin.

Sonra zaman uyumsuz sürümü için yaptım:

[pid 24359] sendto(5, "GET/HTTP/1.1\r\nHost: localhost:1234\r\nConnection: keep-alive\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nUser-Agent: python-requests/2.9.1\r\n\r\n", 144, 0, NULL, 0) = 144 <0.000023> 
[pid 24359] fcntl(5, F_GETFL)   = 0x802 (flags O_RDWR|O_NONBLOCK) <0.000008> 
[pid 24359] fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0 <0.000008> 
[pid 24359] recvfrom(5, 0x2481624, 8192, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable) <0.000009> 
[pid 24359] epoll_ctl(3, EPOLL_CTL_MOD, 5, {EPOLLIN, {u32=5, u64=8589934597}}) = 0 <0.000008> 
[pid 24359] epoll_wait(3, {{EPOLLIN, {u32=5, u64=8589934597}}}, 64, 59743) = 1 <5.009130> 
[pid 24359] recvfrom(5, "HTTP/1.0 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 12\r\nServer: Werkzeug/0.11.5 Python/2.7.10\r\nDate: Tue, 05 Apr 2016 22:29:50 GMT\r\n\r\nHello World!", 8192, 0, NULL, NULL) = 167 <0.000114> 
[pid 24359] close(5)     = 0 <0.000185> 

5 saniye epoll_wait yapıyor harcamak Bu durumda.

Ayrıca, engelleme versiyon asynch versiyonu yapar

fcntl(3, F_SETFL, O_RDWR) 

yapar nerede

fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) 
İlgili konular