我需要监控单个进程(例如,当建立的连接数超过 3000 个时发出警告)并收集其统计信息(例如,确定今天凌晨 1:20 建立了多少个连接,此时服务器运行速度太慢,正如客户所说)。我应该使用什么工具?
答案1
如果您不想安装完整的 Nagios(或其他程序)来监控单个进程,为什么不自己编写一个脚本来做这件事呢?我做过类似的事情来跟踪我们其中一个盒子的数据库连接,使用 netstat 的输出进行计数并将结果记录到文件中。如果计数 >3000,添加几行代码来发送电子邮件应该很简单。
答案2
这可能不是最复杂的解决方案,但是 - 特别是如果你没有其他进程打开这么多套接字 - 你可以检查输出
netstat -nutp
(n:无名称解析,t:TCP,u:UDP,p:显示 PID 和程序 - 您可能只想根据您的进程是否打开 UDP 或 TCP 连接来提供 u 或 t 中的一个)。
您可以从输出中 grep 查找 pid:
netstat -nutp | grep -c ' 12345/progname$'
其中“12345”应替换为您的 PID,而“progname”应替换为您的进程名称。grep 的选项 -c 会计算匹配项。您可能希望优化搜索以更准确地满足您的需求(例如,仅包括 ESTABLISHED 连接)。
'lsof' 也可能是你的朋友。你可以尝试
lsof -p 12345 -a -i4
检查输出并进行一些 grepping。查看 lsof 手册页,看看是否可以修改输出格式以更好地适应脚本解析。
您可以编写一个简单的脚本来定期运行该命令。对于大量连接,您最好试验一下运行 netstat 或 lsof 需要多少资源并调整间隔。例如每分钟一次(默认情况下):
#!/bin/sh
prog=progname
if [ -z "$1" ]; then
interval=60
else
interval="$1"
fi
pid=$(pidof $prog)
while :; do
n=$(netstat -nutp | grep -c " ${pid}/${prog}$')
date +"Number of connections [%Y-%m-%d %H:%M:%S]: $n" > connection.log
if [ "$n" -gt $TRESHOLD ]; then
# warn the admin
fi
sleep "${interval}"
done
(没什么用,仅提供想法)。
答案3
答案4
我会安装 munin 并编写一个插入监控某个服务的特定进程或者特定行为。