在具有 8 个 EBS 卷和大量磁盘流量的 8 路 Amazon EC2 实例(运行 Linux 2.6.21)上,我们看到顶部的 %wa 很高 (30-40%),并且平均负载很高 (8-9)。我的理解是,等待来自 EBS 卷的 I/O 的进程被计入平均负载(一个 ps 显示几个处于 D 状态的进程,大约与负载平均一样多)。
但是,不清楚 %wa 是什么意思。CPU 是否真的被占用等待 EBS 卷的响应,或者内核是否在其上调度了另一个进程?我预计会安排另一个流程;但后来我不明白为什么 iowait 时间会被表示为总 CPU 时间的百分比(除非百分比加起来超过 100%)。
只要我们不最大化 EBS 卷的 I/O 容量,我不担心,但是如果 CPU 被占用等待 I/O,我认为我们的机器会在用完我之前用完 CPU 容量/O 容量。
我们已经经历过几次了。突然我们的生产服务器不会响应,因为一个进程处于无限循环中,或者 MySQL 服务器停止服务新请求,因为一个查询阻塞了一切......
我们通过 SSH 连接到服务器并使用ps auxortop找到罪魁祸首,mytop或者SHOW FULL PROCESSLIST在 MySQL 中找到违规的进程 ID 和kill它。然后我们尝试在测试服务器上重新创建这种情况并修复错误。
但有时服务器挂得太好了,您ps aux/ top/ mytop/SHOW FULL PROCESSLIST无法通过 - 甚至管理员也被阻止。
确保管理员始终可以访问服务器并终止违规进程或查询(在 Linux 和 MySQL 上)的最佳方法是什么?
我已经检查过nice(1),但不断地与 nice -20 建立开放连接似乎有点过分且难以使用(更不用说作为 root 的危险了)。
如果服务器遇到高负载,我会使用 top 和类似工具来解决原因。但是,只有在服务器遇到问题时我可以进行分析,这才有效。
有什么好的工具可以找到以前服务器负载高的根本原因?例如,我计划每 5 分钟进行一次 cron 作业以保存“top”输出、apache 服务器统计信息、mysql 进程列表等。但这似乎不太优雅,想知道是否有人已经提出了一些实用程序来完成此任务。
有没有办法获取当前正在攻击我的 VPS 的 PHP 脚本文件名?
例如,当我查看“顶部”时,我看到:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7622 itil 17 0 61388 11m 6004 R 45.8 2.3 0:00.13 php
7626 itil 17 0 58360 8632 5440 R 24.6 1.6 0:00.07 php
Run Code Online (Sandbox Code Playgroud)
如何找出特定时间 PHP 正在处理的文件?
我正在使用 Jmeter 测试我的 Web 服务器。我启动 40 个用户测试,然后 dump top 命令。我看到的是 40 个(+1 个主机)apache 进程。每个进程使用 appr。7mb RES 内存。但是 7*40 是 280 mb 的内存。但是 top 显示总共有 508mb 和 345mb 空闲。所以只使用了 163mb... 为什么我有这么奇怪的东西?
top - 04:49:24 up 1 day, 10:49, 1 user, load average: 0.28, 0.18, 0.16
Tasks: 107 total, 2 running, 105 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.4%us, 0.4%sy, 0.0%ni, 97.6%id, 0.5%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 508132k total, 162428k used, 345704k free, 28340k buffers
Swap: 916476k total, 21800k used, 894676k free, …Run Code Online (Sandbox Code Playgroud) 我遇到了一个问题,我的一些 Ubuntu/Debian 服务器没有显示在 top 或 ps 中传递给 rake 的参数。我已经将这个问题追溯到 /proc/[pid]/cmdline 给出的输出变化。这个文件似乎控制了 ps 和 top 显示的内容。在正确显示参数的服务器上,cmdline 文件的内容类似于:
ruby^@/home/user/.rvm/gems/ree-1.8.7-2011.03/bin/rake^@log_file_tailer:run^@
Run Code Online (Sandbox Code Playgroud)
但是,在不显示 rake 参数的服务器上,cmdline 的输出看起来像
/home/user/.rvm/gems/ree-1.8.7-2011.03/bin/rake^@ ^@^@^@^@^@
Run Code Online (Sandbox Code Playgroud)
也就是说,文件的内容有两行长,但不包含任何有关传递给 rake 的参数的信息。
FWIW,我拥有的两台服务器以不太有用的格式(缺少参数的格式)输出 cmdline 正在运行
Linux 版本 2.6.32-5-amd64(Debian 2.6.32-46)(dannf@debian.org)(gcc 版本 4.3.5(Debian 4.3.5-4))#1 SMP Sun Sep 23 10:07:46 UTC 2012
和
Linux 版本 3.2.0-23-generic(buildd@crested)(gcc 版本 4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu4))#36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012
有趣的是,对于我看到的除 rake 之外的大多数命令,这些服务器似乎确实正确显示了完整的命令行,包括参数。
有谁知道如何获得完整的命令行(包括参数)以输出到这些服务器上的 cmdline?我非常希望这不需要对内核进行完整的重新编译(我对此几乎没有经验)。
-- 编辑 -- 据推测是 soley rake 负责设置 /proc/[pid]/cmdline 的内容,但这与我们运行相同版本的 rake 的事实不符( 0.8.7) 在提供和不提供由 rake 调用的命令行参数的服务器上。
当我在远程服务器上运行 TOP 时,我看到系统利用率非常低 (3.8%us)。但是,对于实际过程,我看到了 29.6% 的 CPU。
由于这台服务器有8个CPU核心,%CPU是不是只有1个CPU的利用率,而us上面却超过了8个CPU?
当我将 29.6 除以 8 时,我得到 3.7,这似乎验证了我的猜测。所以问题:
最高输出
top - 12:17:40 up 9 days, 21:51, 2 users, load average: 0.32, 0.28, 0.27
Tasks: 201 total, 2 running, 199 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.8%us, 0.1%sy, 0.0%ni, 96.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16229072k total, 5617572k used, 10611500k free, 156480k buffers
Swap: 8388588k total, 0k used, 8388588k free, …Run Code Online (Sandbox Code Playgroud) 我了解top命令(6.5%us、17.2%sy、0.0%ni等...)报告的各种类型的 CPU 使用率,但为什么每个进程的总 CPU 百分比加起来不等于任何Cpu(s)值?例如,下面的 java 进程消耗了 77.5% 的 CPU,但Cpu(s)说 76.0% 仍然处于空闲状态。为什么是这样?这是在单核系统上。
top - 05:53:27 up 32 min, 2 users, load average: 0.16, 0.29, 0.34
Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.5%us, 17.2%sy, 0.0%ni, 76.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 1758616k total, 643432k used, 1115184k free, 12224k buffers
Swap: 917500k total, 0k used, 917500k free, 304608k cached
PID USER PR NI VIRT …Run Code Online (Sandbox Code Playgroud) 更新:
这是由于 nss-softkn 的一个已知问题引起的。见这篇文章:https : //www.splyt.com/blog/2014-05-16-optimizing-aws-nss-softoken
当我从我的 centos 6.5 机器上运行 free -m 时,我看到我只有大约 1400 mb 的可用内存,包括缓存。当我做 top 时,按内存排序并加起来我只看到大约 1600 个正在使用的进程。我应该有更多的空闲内存。这发生在我们的几个盒子上。
[root@db1 ~]# free -m
total used free shared buffers cached
Mem: 7840 7793 47 0 287 1357
-/+ buffers/cache: 6148 1692
Swap: 7983 7 7976
Run Code Online (Sandbox Code Playgroud)
最高输出
这是可视化进程消耗的内存的更好方法:

我意识到在 Docker 容器内运行的进程出现在主机的进程列表中:
# ps aux | grep mariadb
root 12486 0.0 0.0 112812 976 pts/0 S+ 14:47 0:00 grep --color=auto mariadb
Run Code Online (Sandbox Code Playgroud)
有没有办法识别进程是在主机上运行还是在 Docker 容器上运行,或者有办法过滤掉 Docker 进程?
top ×10
linux ×7
ps ×2
amazon-ebs ×1
amazon-ec2 ×1
apache-2.2 ×1
centos ×1
centos6 ×1
centos7 ×1
cpu-usage ×1
debian ×1
docker ×1
iowait ×1
jmeter ×1
kill ×1
memory ×1
memory-usage ×1
mysql ×1
performance ×1
php ×1
process ×1
tomcat ×1
ubuntu ×1
vps ×1