Linux环境运维命令
sar
Collect, report, or save system activity information.
根据要统计的信息类型的不同,输出格式也不同。
统计CPU利用率
1 | # 查看全天 |
CPU统计信息输出格式:
- CPU
all表示统计信息为所有 CPU 的平均值。 - %user
显示在用户级别(application)运行使用 CPU 总时间的百分比。 - %nice
显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。 - %system
在核心级别(kernel)运行所使用 CPU 总时间的百分比。 - %iowait
显示用于等待I/O操作占用 CPU 总时间的百分比。 - %steal
管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。 - %idle
显示 CPU 空闲时间占用 CPU 总时间的百分比。
内存利用率
1 | # 查看全天 |
内存统计信息输出格式
- kbmemfree
这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间。 - kbmemused
这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间。 - %memused
这个值是kbmemused和内存总量(不包括swap)的一个百分比。 - kbbuffers和kbcached
这两个值就是free命令中的buffer和cache。 - kbcommit
保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap)。 - %commit
这个值是kbcommit与内存总量(包括swap)的一个百分比。
磁盘IO
1 | # 查看全天 |
IO信息输出格式
- await
表示平均每次设备I/O操作的等待时间(以毫秒为单位)。 - svctm
表示平均每次设备I/O操作的服务时间(以毫秒为单位)。 - %util
表示一秒中有百分之几的时间用于I/O操作。
网络流量
1 | # 查看全天 |
流量信息输出格式:
- IFACE
就是网络设备的名称。 - rxpck/s
每秒钟接收到的包数目。 - txpck/s
每秒钟发送出去的包数目。 - rxkB/s
每秒钟接收到的字节数。 - txkB/s
每秒钟发送出去的字节数。 - rxcmp/s
每秒钟接收到的压缩包数目。 - txcmp/s
每秒钟发送出去的压缩包数目。 - rxmcst/s
每秒钟接收到的多播包的包数目。
系统信息
- 操作系统版本
1
head -n 1 /etc/issue
- uname(系统信息)
1
uname -a
- hostname(计算机名称)
1
hostname
- lspci(PCI 设备信息)
1
lspci -tv
- lsusb(USB 设备信息)
1
lsusb -tv
- lsmod(系统加载的模块信息)
1
lsmod
- CPU 信息
1
cat /proc/cpuinfo
CPU & 进程
ps
查看进程状态。
参数 | 作用 |
---|---|
-a | 显示所有的进程(包括其他用户的) |
-u | 用户以及其他详细信息 |
-x | 显示没有控制终端的进程 |
1 | ps -ef |
linux 系统中进程最常见的 5 种状态为:
- R(运行):正在运行或在运行队列中等待。
- S(中断):休眠中, 在等待某个条件的形成或接受到信号。
- D(不可中断):收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
- Z(僵死):进程已终止, 但进程描述符存在, 直到父进程调用 wait()系统调用后释放。
- T(停止):进程收到 SIGSTOP, SIGSTP, SIGTIN, SIGTOU 信号后停止运行。
当执行”ps aux”命令后通常会看到下面格式的进程状态,表格中只是列举了部分输出值,而且正常的输出值中不包括中文注释部分:
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|
进程的所有者 | 进程 ID 号 | 运算器占用率 | 内存占用率 | 虚拟内存使用量(单位是 KB) | 占用的固定内存量(单位是 KB) | 所在终端 | 进程状态 | 被启动的时间 | 实际使用 CPU 的时间 | 命令名称与参数 |
root | 1 | 0.0 | 0.4 | 53684 | 7628 | ? | Ss | 07:22 | 0:02 | /usr/lib/systemd/systemd |
root | 2 | 0.0 | 0.0 | 0 | 0 | ? | S | 07:22 | 0:00 | [kthreadd] |
root | 3 | 0.0 | 0.0 | 0 | 0 | ? | S | 07:22 | 0:00 | [ksoftirqd/0] |
root | 5 | 0.0 | 0.0 | 0 | 0 | ? | S< | 07:22 | 0:00 | [kworker/0:0H] |
root | 7 | 0.0 | 0.0 | 0 | 0 | ? | S | 07:22 | 0:00 | [migration/0] |
pidof
查询某个指定服务的进程 PID 号码值,比如
1 | pidof firefox |
kill
终止某个指定 PID 号码的进程
1 | $ kill <PID> |
killall
终止某个指定名称的服务所对应的全部进程,因为一般大型软件的服务程序通常都会有数个进程协同为其提供服务,如果逐个去结束 PID 实在麻烦,所以可以使用 killall 命令来批量结束某个服务程序的全部进程,比如
1 | $ killall httpd |
top
top 命令是 Linux 下常用的性能分析工具,能够动态监视进程活动与系统负载等信息,类似于 Windows 的任务管理器
可以直接使用 top 命令后,查看%MEM 的内容。可以选择按进程查看或者按用户查看,如想查看 oracle 用户的进程内存使用情况的话可以使用如下的命令:
1 | $ top -u oracle |
示例输出如下:
1 | top - 17:59:11 up 289 days, 5:57, 20 users, load average: 0.01, 0.02, 0.05 |
前面的五行为系统整体的统计信息,下面我们来逐行的讲解:
- 第 1 行:系统时间,运行时间(上例中是 289 天 5 小时 57 分),登录用户数,系统负载(分别为 1 分钟、5 分钟、15 分钟的平均值)。
- 第 2 行:进程总数,运行中的,睡眠中的,停止的,僵死的。
- 第 3 行:用户态占用时间比例(us user),内核态占用时间比例(sy system),改变过优先级的进程占用时间比例(ni nice),空闲 CPU 时间比例(id idle),等待 IO 时间比例(wa iowait),处理硬中断时间比例(hi hard interrupt),处理软中断时间比例(si soft interrupt),当前系统运行在虚拟机中的时候、被其他虚拟机占用的 CPU 时间比例(st steal)。
此行数据为百分比,比如11.2 id
意味着有 11.2%的 CPU 资源是空闲的。 - 第 4 行:物理内存总量,空闲量,使用量,作为内核缓存的内存量。
- 第 5 行:虚拟内存总量,空闲量,使用量,已被提前加载的内存数据。
后面每行是进程的统计数据,其中:
PID:进程的 ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NInice:值
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S 表示休眠,R 表示正在运行,Z 表示僵死状态,N 表示该进程优先值为负数
%CPU:进程占用 CPU 的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的 CPU 时间,即占用 CPU 使用时间的累加值。
COMMAND:进程启动命令名称
常用的命令:
P:按%CPU 使用率排行
T:按 MITE+排行
M:按%MEM 排行
pmap
可以根据进程查看进程相关信息占用的内存情况,(进程号可以通过 ps 查看)如下所示:
1 | $ pmap -d 14596 |
内存
/proc/meminfo
查看内存总量和空闲内存量
1 | $ grep MemTotal /proc/meminfo |
free
内存和交换分区容量及使用情况
1 | $ free |
total:总计内存量
used:已用量
free:可用量
shared:进程共享的内存量
buffers:磁盘缓存的内存量
cached:缓存的内存量
pmap
TODO
硬盘
df
硬盘分区使用情况
1 | df |
du
查看某个目录的大小
1 | du -sh <目录> |
网络
TODO
ifconfig
获取网卡配置与网络状态等信息
1 | $ ifconfig |
注意每段开头的网卡名称、inet 参数后面的 IP 地址、ether 参数后面的物理 mac 地址,以及 RX、TX 的接受与发送数据包的大小
nc
netstat
iostat
tcpdump
mtr
监控
syslog
TODO
dmesg
如果发现自己的 java 进程悄无声息的消失了,几乎没有留下任何线索,那么 dmesg 一发,很有可能有你想要的。
1 | sudo dmesg|grep -i kill|less |
去找关键字 oom_killer。找到的结果类似如下:
1 | [6710782.021013] java invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_scoe_adj=0 |
以上表明,对应的 java 进程被系统的 OOM Killer 给干掉了,得分为 854.
解释一下 OOM killer(Out-Of-Memory killer),该机制会监控机器的内存资源消耗。当机器内存耗尽前,该机制会扫描所有的进程(按照一定规则计算,内存占用,时间等),挑选出得分最高的进程,然后杀死,从而保护机器。
dmesg 日志时间转换公式:
log 实际时间=格林威治 1970-01-01+(当前时间秒数-系统启动至今的秒数+dmesg 打印的 log 时间)秒数:
1 | date -d "1970-01-01 UTC `echo "$(date +%s)-$(cat /proc/uptime|cut -f 1 -d' ')+12288812.926194"|bc ` seconds" |
剩下的,就是看看为什么内存这么大,触发了 OOM-Killer 了。
/proc/loadavg
系统负载
1 | $ cat /proc/loadavg |
uptime
包括当前系统时间、系统已运行时间、当前在线用户、平均负载值等。
平均负载值指的是最近 1/5/15 分钟的系统压力情况,负载值越低越好,尽量不要长期超过 1。
1 | $ uptime |
配合 watch 命令来每秒刷新一次来获得当前系统负载情况:
1 | watch -n 1 uptime |
vmstat
TODO
dmidecode
TODO