HTTP SLI 调研 (2)

黎 浩然/ 28 6 月, 2022/ 扩展的伯克利数据包过滤器/EXTENDEDBERKELLEYPACKETFILTER/EBPF, 计算机/COMPUTER/ 0 comments

nginx的工作模式如下:

处理请求的实际上是worker进程。下图为strace输出的跟踪nginx的某个worker进程在处理HTTP请求时的系统调用过程:

可以看到经过的系统调用为accept4、recvfrom、writev和close。这些函数处于用户态上下文中,其相对应的内核态调用为_sys_accept4、__sys_recvfrom、__x64_sys_writev(amd64位系统下)和__close_fd。

类似的方法,可以得到Apache的工作进程的系统调用过程是__sys_accept4、ksys_read、__x64_sys_writev(amd64位系统下)和__close_fd。

以上的系统调用过程针对于明文的HTTP流量。对于HTTPS加密流量,在OpenSSL库的SSL_read和SSL_write函数处挂用户态探针并判断是否为HTTP流量及所属的请求类型(对应HTTP流量的ksys_read/__sys_recvfrom和__x64_sys_writev)。

当HTTP服务进程调用__x64_sys_writev或SSL_write发送HTTP响应后,数据包转交内核TCP/IP相应的进程处理。数据包的发送会通过tcp_event_new_data_sent函数。当服务端收到来自用户的TCP ACK时会进入到tcp_rate_skb_delivered函数。

HTTP探针采集的请求处理时间是计算ksys_read/__sys_recvfrom/SSL_read到tcp_rate_skb_delivered这两个函数调用经过的时间间隔获得的。利用ebpf的kprobe/kretprobe在函数的入口处或返回处挂载探针,采集并保存响应的数据。

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*