2016-04-05 1 views
3

У меня есть небольшой сервер gevent, который также является http-клиентом другого apis. Одна библиотека, которую я использую, имеет httplib как зависимость.Что я могу сделать для вывода strace из приложения gevent, чтобы проверить, использует ли он блокировку сети IO?

я обезьяна.patch_all. Там нет диска IO, просто сеть.

Я ржав на своих системных вызовах, но мне было интересно, будет ли простой способ проверить, выполняются ли блокирующие вызовы с помощью strace.

Я знаю, как использовать strace, но я не уверен точно, для чего я могу grep.

Будет ли это работать?

Благодаря

ответ

1

Пошел вперед экспериментировал немного себя и думаю, что я нашел, по крайней мере, частичный ответ.

Я сделал броский webapp, который просто спит 5 секунд, а затем отвечает «привет».

Затем я написал двух клиентов. Один использует запросы python, другой использует grequests (модуль асинхронных запросов).

Первый клиент:

import requests 

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

Второй клиент:

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

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

Я побежал эти как:

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

В выходе (ожидается) блокирование версии, я получаю:

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> 

Обратите внимание на 5-секундное время ожидания в конце строки для первого recvfrom.

Тогда я сделал это для версии асинхронном:

[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 секунд тратится делать epoll_wait.

Кроме того, когда блокирующая версия делает

fcntl(3, F_SETFL, O_RDWR) 

версия делает асинхронного

fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) 
Смежные вопросы