我正在通过 uwsgi 使用 nginx 运行一个 django 站点。问题是,当流量很大时,uwsgi 进程会占用大量 CPU 时间。相同的配置在测试服务器上运行良好,siege/ab 模拟大量并发流量。
这是 uwsgi 进程的一个 strace 日志。http://dl.dropbox.com/u/43017476/strace.log
还有一些 sysctl:
fs.file-max = 128000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.core.somaxconn = 250000
net.ipv4.tcp_keepalive_time = 300
nginx conf 与 Google 上的其他教程非常相似。我一直想弄明白,但没有成功。不过,我找到了很多这样的文章:
22:12:02.932276 read(8, "\7\0\0\2\0\0\0\2\0\0\0", 16384) = 11
22:12:02.932504 poll([{fd=8, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
22:12:02.932547 write(8, "\17\0\0\0\3SET NAMES utf8", 19) = 19
22:12:02.932643 read(8, "\7\0\0\1\0\0\0\2\0\0\0", 16384) = 11
22:12:02.933237 poll([{fd=8, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
22:12:02.933279 write(8, "\21\0\0\0\3set autocommit=0", 21) = 21
22:12:02.933330 read(8, "\7\0\0\1\0\0\0\0\0\0\0", 16384) = 11
而文件描述符 8 是 mysql 套接字。但 Mysql 服务器似乎运行良好。我可以看到每个“读取”系统调用都消耗了大部分 CPU 时间,但不知道这里出了什么问题。同一台数据库服务器一直在为以前的 PHP 站点提供服务,没有任何问题。
任何想法都值得赞赏。
答案1
strace 可能不会显示消耗 CPU 时间的内容,因为它显示的是系统调用。显示进程消耗的 CPU 时间是花在应用程序本身中执行代码的时间。您显示的读/写/轮询很可能是正常的 MySQL 通信,或者是应用程序轮询 mysql FD(非阻塞)以寻找新流量。
我确实没有办法帮你找到导致 CPU 使用率过高的原因,但是我想我可以让你避免花太多时间在 strace 输出中寻找答案 :)