一个可能的方法是通过
vmstat 1
命令来实现。问题在于每个输出之间的时间并不总是完全一秒钟,特别是在繁忙的服务器上。我希望能够每秒输出时间戳和CPU使用率。有什么简单的方法可以实现这一点,而不需要安装特殊的工具?
有多种方法可以做到这一点。除了顶部,另一种方法是使用"sar"实用程序。所以可以这样做:
sar -u 1 10
该命令将每秒运行10次,给出CPU利用率。最后将输出系统、用户、iowait和空闲时间的平均值。
另一个实用程序是"mpstat",它与sar提供了类似的功能。
使用广为人知的UNIX工具top
,通常可在Linux系统上使用:
top -b -d 1 > /tmp/top.log
top
的每个输出块的第一行都包含一个时间戳。top
显示的行数。
top
man页面的5a.系统配置文件和5b.个人配置文件部分描述了在交互模式下运行top
时按W
键创建$HOME/.toprc
配置文件。.toprc
文件,并更改了所有maxtasks
值,使它们为maxtasks=4
。然后top
只显示4行输出。 top -b -d 1 | awk '/load average/ {n=10} {if (n-- > 0) {print}}' > /tmp/top.log
top -p 1 -b -d 1 | awk '/^top/ {n=2} !/Tasks/ {if (n-- > 0) {print}}'
看起来很好地限制了输出内容,只显示我所需的部分。现在我有一个后续问题:从 top 命令输出中合并和处理两行。 - dabest1# #!/usr/bin/env bash
# Define a timestamp function
LOGPATH="/var/log/systemstatus.log"
timestamp() {
date +"%Y-%m-%dT%T.%N"
}
#server load
while ( sleep 10 ) ; do
echo -n "$(timestamp) linux::systemstatus::load " >> $LOGPATH
cat /proc/loadavg >> $LOGPATH
#cpu usage
echo -n "$(timestamp) linux::systemstatus::cpu " >> $LOGPATH
top -bn 1 | sed -n 3p >> $LOGPAT
#disk usage
echo -n "$(timestamp) linux::systemstatus::storage " >> $LOGPATH
df --total|grep total|sed "s/total//g"| sed 's/^ *//' >> $LOGPATH
done
我找到了一种巧妙的方法,可以在vmstat输出中显示时间戳信息。
示例命令:
vmstat -n 1 3 | while read line; do echo "$(date --iso-8601=seconds) $line"; done
输出:
2013-09-13T14:01:31-0700 进程 -----------内存----------- ---交换--- ----I/O---- --系统-- ----CPU----
2013-09-13T14:01:31-0700 运行 阻塞 虚拟内存 空闲内存 缓存 内存 页内存交换磁盘空间 读I/O操作 写I/O操作 中断次数 上下文切换次数 用户态时间 系统态时间 空闲态时间 等待态时间
2013-09-13T14:01:31-0700 1 1 4197640 29952 124584 12477708 12 5 449 147 2 0 7 4 82 7
2013-09-13T14:01:32-0700 3 0 4197780 28232 124504 12480324 392 180 15984 180 1792 1301 31 15 38 16
2013-09-13T14:01:33-0700 0 1 4197656 30464 124504 12477492 344 0 2008 0 1892 1929 32 14 43 10
top
:top -b -d 1 > /tmp/top.log
。每个top
输出列表的第一行都包含一个时间戳。 - Simon C