php – 我的服务器发生了什么?高负载,大量空闲CPU时间,低磁盘利
我运营一个网站,并向订阅者发送合法的选择性每日电子邮件简报. Web托管和电子邮件发送都由同一台机器完成.
我有大约10万订阅者选择了我的每日电子邮件简报.我的PHP脚本在最近才向所有人发送邮件方面做得非常好,但随着列表的增长,我无法跟上. 当我运行顶部时,我的负载非常高 – 通常至少为6或7,有时高达15 – 尽管我只有两个CPU.但是,当我运行sar时,我的CPU平均闲置约30%的时间.所以,似乎我不受CPU限制.当我运行iostat时,似乎我没有磁盘绑定,因为我的每个设备的%util都非常低(不超过5%). 鉴于我似乎没有CPU绑定或磁盘绑定,为什么顶级报告如此高负载? 另外,由于我似乎没有CPU绑定或磁盘绑定,为什么我的电子邮件发送脚本无法跟上? 这是我在跑步时看到的: top - 11:33:28 up 74 days,18:49,2 users,load average: 7.65,8.79,8.28 Tasks: 168 total,5 running,162 sleeping,0 stopped,1 zombie Cpu(s): 38.9%us,58.6%sy,0.8%ni,0.0%id,0.7%wa,0.2%hi,0.8%si,0.0%st Mem: 3083012k total,2144436k used,938576k free,281136k buffers Swap: 2048248k total,39164k used,2009084k free,1470412k cached 这是我在运行iostat -mx时看到的内容: avg-cpu: %user %nice %system %iowait %steal %idle 34.80 1.20 55.24 0.37 0.00 8.38 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util sda 0.19 71.70 1.59 29.45 0.02 0.07 5.90 0.55 17.82 1.16 3.59 sda1 0.00 0.00 0.00 0.00 0.00 0.00 7.10 0.00 13.80 13.72 0.00 sda2 0.05 50.45 1.13 24.57 0.01 0.29 24.25 0.35 13.43 1.15 2.97 sda3 0.05 10.17 0.20 2.33 0.01 0.05 43.75 0.05 20.96 2.45 0.62 sda4 0.00 0.00 0.00 0.00 0.00 0.00 2.00 0.00 70.50 70.50 0.00 sda5 0.07 0.22 0.03 0.07 0.00 0.00 32.84 0.08 856.19 8.03 0.08 sda6 0.02 5.45 0.03 0.72 0.00 0.02 67.55 0.02 26.72 5.26 0.39 sda7 0.00 1.56 0.00 0.42 0.00 0.01 38.04 0.00 8.88 5.84 0.24 sda8 0.01 3.84 0.20 1.35 0.00 0.02 28.55 0.05 31.90 4.08 0.63 这是我在运行sar时看到的内容: 09:40:02 AM CPU %user %nice %system %iowait %steal %idle 09:50:01 AM all 30.59 1.01 49.80 0.23 0.00 18.37 10:00:08 AM all 31.73 0.92 51.66 0.13 0.00 15.55 10:10:06 AM all 30.43 0.99 48.94 0.26 0.00 19.38 10:20:01 AM all 29.58 1.00 47.76 0.25 0.00 21.42 10:30:01 AM all 29.37 1.02 47.30 0.18 0.00 22.13 10:40:06 AM all 32.50 1.01 52.94 0.16 0.00 13.39 10:50:01 AM all 30.49 1.00 49.59 0.15 0.00 18.77 11:00:01 AM all 29.43 0.99 47.71 0.17 0.00 21.71 11:10:07 AM all 30.26 0.93 49.48 0.83 0.00 18.50 11:20:02 AM all 29.83 0.81 48.51 1.32 0.00 19.52 11:30:06 AM all 31.18 0.88 51.33 1.15 0.00 15.47 Average: all 26.21 1.15 42.62 0.48 0.00 29.54 以下是在我碰巧运行top -c的特定时间列出的少数几个进程: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 8180 mysql 16 0 57448 19m 2948 S 26.6 0.7 4702:26 /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/bristno.pid --skip-external-locking 26956 brristno 17 0 0 0 0 Z 8.0 0.0 0:00.24 [php] <defunct> 26958 brristno 17 0 94408 43m 37m R 5.0 1.4 0:00.15 /usr/bin/php /home/brristno/public_html/dbv.php 22852 nobody 16 0 9628 2900 1524 S 0.7 0.1 0:00.17 /usr/local/apache/bin/httpd -k start -DSSL 8591 brristno 34 19 96896 13m 6652 S 0.3 0.4 0:29.82 /usr/local/bin/php /home/brristno/bin/mailer.php 1qwqyb6 i0gbor 24469 nobody 16 0 9628 2880 1508 S 0.3 0.1 0:00.08 /usr/local/apache/bin/httpd -k start -DSSL 25495 nobody 15 0 9628 2876 1500 S 0.3 0.1 0:00.06 /usr/local/apache/bin/httpd -k start -DSSL 26149 nobody 15 0 9628 2864 1504 S 0.3 0.1 0:00.04 /usr/local/apache/bin/httpd -k start -DSSL 谢谢你,德米特里! 1)我已经有一个脚本取消订阅过去一个月内至少退回五次的电子邮件地址,所以希望这会使我的列表相对受限于活动的电子邮件地址. 2)我正在使用exim 4.69.我的配置文件是 /etc/exim.conf 我的日志文件位于: 在/ var /日志/ exim_mainlog 另外,当我查看/etc/syslog.conf时,我看到以下内容: # Log all the mail messages in one place. mail.* -/var/log/maillog 我不知道 – / var / log / maillog开头的“ – ”是什么意思,但是当我查看该文件时,很明显很多东西都被记录在那里. 此外,此文件中还记录了很多内容: 在/ var /日志/ exim_mainlog 我之后添加到/etc/exim.conf这一行: no_message_logs 我认为这会禁用邮件日志记录(我确实重启了exim),但是当我查看/ var / log / maillog和/ var / log / exim_mainlog时,两个文件仍然在接收新的日志条目. 问题:如何禁用大多数/所有exim日志记录? 3)当我查看/ var / log / exim_paniclog时,我看到很多像这样的条目: 2010-12-19 04:03:32 1PUFB1-0006xZ-GF User 0 set for local_delivery transport is on the never_users list 环顾四周后,似乎这意味着exim正在尝试传递到根电子邮件地址.在尽可能少地使用CPU资源的情况下,将这些邮件传递到root的最佳方法是什么?
如上所述,负载平均值与运行队列中的等待进程数相关.如果这些进程中的每一个都没有什么工作要做,并且可以快速释放处理器,那么您可以处理比每个CPU经验法则更大的负载平均值.
邮件就是这个的完美例子,每个进程都需要CPU发送消息,但非常非常少.我见过邮件系统运行sendmail的平均负载在25到35之间,系统仍然是交互式的,工作正常. 标记 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |