Skip to content

strace

追踪内核执行过程

安装

yum install -y strace

使用

ps -ef | grep nginx

root        877      1  0 15:55 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody     1047    877  0 16:04 ?        00:00:00 nginx: worker process
nobody     1048    877  0 16:04 ?        00:00:00 nginx: cache manager process
root       1051    983  0 16:05 pts/0    00:00:00 grep --color=auto nginx

strace -p 1047

之后访问 192.168.44.101

epoll_wait(10, [{EPOLLIN, {u32=1876598800, u64=139687097966608}}], 512, -1) = 1
accept4(6, {sa_family=AF_INET, sin_port=htons(62671), sin_addr=inet_addr("192.168.44.1")}, [112->16], SOCK_NONBLOCK) = 4
epoll_ctl(10, EPOLL_CTL_ADD, 4, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=1876599449, u64=139687097967257}}) = 0
epoll_wait(10, [{EPOLLIN, {u32=1876598800, u64=139687097966608}}, {EPOLLIN, {u32=1876599449, u64=139687097967257}}], 512, 60000) = 2
accept4(6, {sa_family=AF_INET, sin_port=htons(62672), sin_addr=inet_addr("192.168.44.1")}, [112->16], SOCK_NONBLOCK) = 5
epoll_ctl(10, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=1876599233, u64=139687097967041}}) = 0
recvfrom(4, "GET / HTTP/1.1\r\nHost: 192.168.44"..., 1024, 0, NULL, NULL) = 534
stat("/usr/local/nginx//html/index.html", {st_mode=S_IFREG|0644, st_size=1, ...}) = 0
open("/usr/local/nginx//html/index.html", O_RDONLY|O_NONBLOCK) = 8
fstat(8, {st_mode=S_IFREG|0644, st_size=1, ...}) = 0
writev(4, [{iov_base="HTTP/1.1 304 Not Modified\r\nServe"..., iov_len=178}], 1) = 178
write(3, "192.168.44.1 - - [07/Oct/2022:16"..., 187) = 187
close(8)                                = 0
setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = 0
epoll_wait(10,

关闭 sendfile 后访问 192.168.44.101 多出 pread64 读取文件。

epoll_wait(10, [{EPOLLIN, {u32=1876599233, u64=139687097967041}}], 512, 44326) = 1
recvfrom(3, "GET / HTTP/1.1\r\nHost: 192.168.44"..., 1024, 0, NULL, NULL) = 472
stat("/usr/local/nginx//html/index.html", {st_mode=S_IFREG|0644, st_size=1, ...}) = 0
open("/usr/local/nginx//html/index.html", O_RDONLY|O_NONBLOCK) = 9
fstat(9, {st_mode=S_IFREG|0644, st_size=1, ...}) = 0
pread64(9, "1", 1, 0)                   = 1
writev(3, [{iov_base="HTTP/1.1 200 OK\r\nServer: nginx/1"..., iov_len=234}, {iov_base="1", iov_len=1}], 2) = 235
write(4, "192.168.44.1 - - [07/Oct/2022:16"..., 187) = 187
close(9)                                = 0
epoll_wait(10, [{EPOLLIN, {u32=1876599233, u64=139687097967041}}], 512, 43498) = 1
recvfrom(3, "GET /favicon.ico HTTP/1.1\r\nHost:"..., 1024, 0, NULL, NULL) = 415
open("/usr/local/nginx//html/favicon.ico", O_RDONLY|O_NONBLOCK) = 9
fstat(9, {st_mode=S_IFREG|0644, st_size=4286, ...}) = 0
pread64(9, "\0\0\1\0\1\0  \0\0\1\0 \0\250\20\0\0\26\0\0\0(\0\0\0 \0\0\0@\0"..., 4286, 0) = 4286
writev(3, [{iov_base="HTTP/1.1 200 OK\r\nServer: nginx/1"..., iov_len=243}, {iov_base="\0\0\1\0\1\0  \0\0\1\0 \0\250\20\0\0\26\0\0\0(\0\0\0 \0\0\0@\0"..., iov_len=4286}], 2) = 4529
write(4, "192.168.44.1 - - [07/Oct/2022:16"..., 222) = 222
close(9)                                = 0
epoll_wait(10,

sendfile 缓存优化

nginx
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout 60;

    server {
        listen       80;
        server_name  120.78.79.181;
       
        location / {
            # max 表示能够缓存的文件的个数,inactive 表示规定时间内没有被访问则缓存
            # 失效。
            open_file_cache max=500 inactive=60s;
            # 访问多少次后建立缓存
            open_file_cache_min_uses 1; 
            # 定时检查文件有没有发生变化
            open_file_cache_valid 60s; 
            # 错误的信息是否缓存
            open_file_cache_errors on;

            root html;
            index index.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

第一次访问有 open

epoll_wait(10, [{EPOLLIN, {u32=1876598800, u64=139687097966608}}], 512, -1) = 1
accept4(6, {sa_family=AF_INET, sin_port=htons(63693), sin_addr=inet_addr("192.168.44.1")}, [112->16], SOCK_NONBLOCK) = 3
epoll_ctl(10, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=1876599232, u64=139687097967040}}) = 0
epoll_wait(10, [{EPOLLIN, {u32=1876598800, u64=139687097966608}}, {EPOLLIN, {u32=1876599232, u64=139687097967040}}], 512, 60000) = 2
accept4(6, {sa_family=AF_INET, sin_port=htons(63694), sin_addr=inet_addr("192.168.44.1")}, [112->16], SOCK_NONBLOCK) = 4
epoll_ctl(10, EPOLL_CTL_ADD, 4, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=1876599448, u64=139687097967256}}) = 0
recvfrom(3, "GET / HTTP/1.1\r\nHost: 192.168.44"..., 1024, 0, NULL, NULL) = 472
open("/usr/local/nginx//html/index.html", O_RDONLY|O_NONBLOCK) = 7
fstat(7, {st_mode=S_IFREG|0644, st_size=1, ...}) = 0
writev(3, [{iov_base="HTTP/1.1 200 OK\r\nServer: nginx/1"..., iov_len=234}], 1) = 234
sendfile(3, 7, [0] => [1], 1)           = 1
write(8, "192.168.44.1 - - [07/Oct/2022:16"..., 187) = 187
setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
epoll_wait(10, [{EPOLLIN, {u32=1876599232, u64=139687097967040}}], 512, 60000) = 1
recvfrom(3, "GET /favicon.ico HTTP/1.1\r\nHost:"..., 1024, 0, NULL, NULL) = 415
open("/usr/local/nginx//html/favicon.ico", O_RDONLY|O_NONBLOCK) = 12
fstat(12, {st_mode=S_IFREG|0644, st_size=4286, ...}) = 0
writev(3, [{iov_base="HTTP/1.1 200 OK\r\nServer: nginx/1"..., iov_len=243}], 1) = 243
sendfile(3, 12, [0] => [4286], 4286)    = 4286
write(8, "192.168.44.1 - - [07/Oct/2022:16"..., 222) = 222
epoll_wait(10,

之后访问没有 open

epoll_wait(10, [{EPOLLIN, {u32=1876598800, u64=139687097966608}}], 512, -1) = 1
accept4(6, {sa_family=AF_INET, sin_port=htons(63745), sin_addr=inet_addr("192.168.44.1")}, [112->16], SOCK_NONBLOCK) = 3
epoll_ctl(10, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=1876599232, u64=139687097967040}}) = 0
epoll_wait(10, [{EPOLLIN, {u32=1876599232, u64=139687097967040}}], 512, 60000) = 1
recvfrom(3, "GET / HTTP/1.1\r\nHost: 192.168.44"..., 1024, 0, NULL, NULL) = 534
writev(3, [{iov_base="HTTP/1.1 304 Not Modified\r\nServe"..., iov_len=178}], 1) = 178
write(8, "192.168.44.1 - - [07/Oct/2022:16"..., 187) = 187
setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
epoll_wait(10, [{EPOLLIN, {u32=1876598800, u64=139687097966608}}], 512, 60000) = 1
accept4(6, {sa_family=AF_INET, sin_port=htons(63746), sin_addr=inet_addr("192.168.44.1")}, [112->16], SOCK_NONBLOCK) = 4
epoll_ctl(10, EPOLL_CTL_ADD, 4, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=1876599448, u64=139687097967256}}) = 0
epoll_wait(10, [{EPOLLIN|EPOLLRDHUP, {u32=1876599232, u64=139687097967040}}, {EPOLLIN|EPOLLRDHUP, {u32=1876599448, u64=139687097967256}}], 512, 59999) = 2
recvfrom(3, "", 1024, 0, NULL, NULL)    = 0
close(3)                                = 0
recvfrom(4, "", 1024, 0, NULL, NULL)    = 0
close(4)                                = 0
epoll_wait(10,