Linux环境运维命令

sar

Collect, report, or save system activity information.
根据要统计的信息类型的不同,输出格式也不同。

统计CPU利用率

1
2
3
4
# 查看全天
sar -p
# 每隔1秒统计一次,统计10次
sar -u 1 10

CPU统计信息输出格式:

  • CPU
    all表示统计信息为所有 CPU 的平均值。
  • %user
    显示在用户级别(application)运行使用 CPU 总时间的百分比。
  • %nice
    显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
  • %system
    在核心级别(kernel)运行所使用 CPU 总时间的百分比。
  • %iowait
    显示用于等待I/O操作占用 CPU 总时间的百分比。
  • %steal
    管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
  • %idle
    显示 CPU 空闲时间占用 CPU 总时间的百分比。

内存利用率

1
2
3
4
# 查看全天
sar -r
# 每隔1秒统计一次,统计10次
sar -r 1 10

内存统计信息输出格式

  • 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
2
3
4
# 查看全天
sar -d
# 每隔1秒统计一次,统计10次
sar -d 1 10

IO信息输出格式

  • await
    表示平均每次设备I/O操作的等待时间(以毫秒为单位)。
  • svctm
    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
  • %util
    表示一秒中有百分之几的时间用于I/O操作。

网络流量

1
2
3
4
# 查看全天
sar -n DEV
# 每个1秒统计一次,统计10次
sar -n DEV 1 10

流量信息输出格式:

  • IFACE
    就是网络设备的名称。
  • rxpck/s
    每秒钟接收到的包数目。
  • txpck/s
    每秒钟发送出去的包数目。
  • rxkB/s
    每秒钟接收到的字节数。
  • txkB/s
    每秒钟发送出去的字节数。
  • rxcmp/s
    每秒钟接收到的压缩包数目。
  • txcmp/s
    每秒钟发送出去的压缩包数目。
  • rxmcst/s
    每秒钟接收到的多播包的包数目。

系统信息

  1. 操作系统版本
    1
    head -n 1 /etc/issue
  2. uname(系统信息)
    1
    uname -a
  3. hostname(计算机名称)
    1
    hostname
  4. lspci(PCI 设备信息)
    1
    lspci -tv
  5. lsusb(USB 设备信息)
    1
    lsusb -tv
  6. lsmod(系统加载的模块信息)
    1
    lsmod
  7. CPU 信息
    1
    cat /proc/cpuinfo

CPU & 进程

ps

查看进程状态。

参数 作用
-a 显示所有的进程(包括其他用户的)
-u 用户以及其他详细信息
-x 显示没有控制终端的进程
1
2
3
4
5
ps -ef
ps -aux
$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'
# 其中rsz为实际内存,实现按内存排序,由大到小
$ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep oracle | sort -nrk5

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
2
3
$ kill <PID>
# 杀掉所有进程名里带idea的
$ ps -aux | grep idea | awk '{print $2}' | xargs kill

killall

终止某个指定名称的服务所对应的全部进程,因为一般大型软件的服务程序通常都会有数个进程协同为其提供服务,如果逐个去结束 PID 实在麻烦,所以可以使用 killall 命令来批量结束某个服务程序的全部进程,比如

1
$ killall httpd

top

top 命令是 Linux 下常用的性能分析工具,能够动态监视进程活动与系统负载等信息,类似于 Windows 的任务管理器
可以直接使用 top 命令后,查看%MEM 的内容。可以选择按进程查看或者按用户查看,如想查看 oracle 用户的进程内存使用情况的话可以使用如下的命令:

1
$ top -u oracle

示例输出如下:

1
2
3
4
5
6
7
8
9
10
11
top - 17:59:11 up 289 days,  5:57, 20 users,  load average: 0.01, 0.02, 0.05
Tasks: 201 total, 2 running, 199 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8010956 total, 465600 free, 886236 used, 6659120 buff/cache
KiB Swap: 8191996 total, 8170296 free, 21700 used. 6412852 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
751 root 20 0 555136 7428 3784 S 0.3 0.1 29:27.31 tuned
1176 root 20 0 91160 2032 1712 S 0.3 0.0 248:22.80 zabbix_agentd
2287 root 20 0 1033580 260536 3204 S 0.3 3.3 149:31.25 salt-minion
......

前面的五行为系统整体的统计信息,下面我们来逐行的讲解:

  • 第 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
2
$ grep MemTotal /proc/meminfo
$ grep MemFree /proc/meminfo

free

内存和交换分区容量及使用情况

1
2
3
4
5
6
7
8
9
10
$ free
total used free shared buffers cached
Mem: 2902976 932640 1970336 9856 928 328196
-/+ buffers/cache: 603516 2299460
Swap: 2097148 0 2097148
$ free -h
total used free shared buffers cached
Mem: 2.8G 910M 1.9G 9.6M 928K 320M
-/+ buffers/cache: 589M 2.2G
Swap: 2.0G 0B 2.0G

total:总计内存量
used:已用量
free:可用量
shared:进程共享的内存量
buffers:磁盘缓存的内存量
cached:缓存的内存量

pmap

TODO

硬盘

df

硬盘分区使用情况

1
df

du

查看某个目录的大小

1
du -sh <目录>

网络

TODO

ifconfig

获取网卡配置与网络状态等信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ ifconfig

eno16777728: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:62:f3:d0 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 514 bytes 41612 (40.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 514 bytes 41612 (40.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

注意每段开头的网卡名称、inet 参数后面的 IP 地址、ether 参数后面的物理 mac 地址,以及 RX、TX 的接受与发送数据包的大小

nc

netstat

iostat

tcpdump

mtr

监控

Linux性能观测工具

syslog

TODO

dmesg

如果发现自己的 java 进程悄无声息的消失了,几乎没有留下任何线索,那么 dmesg 一发,很有可能有你想要的。

1
sudo dmesg|grep -i kill|less

去找关键字 oom_killer。找到的结果类似如下:

1
2
3
4
5
[6710782.021013] java invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_scoe_adj=0
[6710782.070639] [<ffffffff81118898>] ? oom_kill_process+0x68/0x140
[6710782.257588] Task in /LXC011175068174 killed as a result of limit of /LXC011175068174
[6710784.698347] Memory cgroup out of memory: Kill process 215701 (java) score 854 or sacrifice child
[6710784.707978] Killed process 215701, UID 679, (java) total-vm:11017300kB, anon-rss:7152432kB, file-rss:1232kB

以上表明,对应的 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
2
$ uptime
05:43:50 up 16 min, 2 users, load average: 0.00, 0.07, 0.13

配合 watch 命令来每秒刷新一次来获得当前系统负载情况:

1
watch -n 1 uptime

vmstat

TODO

dmidecode

TODO

参考

  1. 温度 sensors
  2. Linux 性能检测常用的 10 个基本命令