Linux日常系统运维管理
1. 监控系统的状态
1.1 使用w命令查看当前系统的负载
[root@lz-01 ~]# w
08:33:35 up 7 min, 1 user, load average: 0.00, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.253.1 08:26 7.00s 0.01s 0.00s w
w命令显示信息丰富, 每行信息如下:
- 第1行从左至右显示的信息依次为: 系统时间,系统运行时间,登录用户数,平均负载
- 第2行开始的所有行提示:当前登录的用户名及登录地址等
上述信息中最需要关注的平均负载load average:后边3个数值, 分别表示1分钟 5分钟 15分钟内系统的平均负载.
着重看第1个值, 表示单位时间段内使用CPU的活动进程数, 值越大说明服务器的压力越大. 一般这个值不超过服务器的逻辑CPU数量就没关系
如何查看CPU数量
[root@lz-01 ~]# grep -c 'processor' /proc/cpuinfo
2
上例中CPU数量有2个
- /proc/cpuinfo这个文件记录CPU的详细信息. 服务器有很多是2颗多核CPU,在linux中计算是 2*n个CPU (n为单颗CPU上有几核);
- n为4时,查看/proc/cpuinfo这个文件时会显示8段信息, 最后一段processor会显示7
- 查看有几颗物理CPU时, 需要查看physical id
1.2 使用vmstat命令监控系统的状态
w命令查看系统整体负载,无法判断具体是哪里有压力; vmstat可以判断
[root@lz-01 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1577072 2076 151568 0 0 59 3 64 127 0 1 98 0 0
vmstat命令打印结果分为6部分: procs, memory, swap, io, system, cpu; 我们重点关注r, b, si, so, bi, bo
- procs 显示进程的相关信息
- r (run): 表示运行或等待CPU时间片的进程数
- b (block): 表示等待资源的进程数, 这个资源指的是I/O,内存等. 该数值如果长时间大于1,需要关注
- memory显示内存的相关信息
- swpd: 表示切换到交换分区中的内存数量,单位KB
- free: 表示当前空闲的内存数量,单位KB
- buff: 表示(即将写入磁盘的)缓冲大小,单位KB
- cache: 表示 (从磁盘中读取的)缓存大小,单位KB
- swap 显示内存的交换情况
- si: 表示由交换区写入内存的数据量,单位KB
- so: 表示由内存写入交换区的数据量,单位KB
- io 显示磁盘的使用情况
- bi: 表示从块设备读取数据的量(读磁盘),单位KB
- bo; 表示从块设备写入数据的量(写磁盘), 单位KB
- system 显示采集间隔内发生的中断次数
- in: 表示在某一时间间隔内观测到的每秒设备中的中断次数
- cs: 表示每秒产生的上下文切换次数
- cpu 显示CPU的使用状态
- us: 显示用户下所花费CPU的时间百分比
- sy: 显示系统花费CPU的时间百分比
- id: 表示CPU处于空闲状态的时间百分比
- wa: 表示I/O等待所占用的CPU的时间百分比
- st: 表示被偷走的CPU所占百分比(一般为0,不用关注)
Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器; Buffer:缓冲区,用于存储速度不同步的设备或优先级不同的设备之间传输数据
[root@lz-01 ~]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1577112 2076 151568 0 0 58 3 63 125 0 1 98 0 0
0 0 0 1577088 2076 151568 0 0 0 0 63 67 0 1 100 0 0
0 0 0 1577088 2076 151568 0 0 0 0 45 58 0 0 100 0 0
0 0 0 1577088 2076 151568 0 0 0 0 28 39 0 0 100 0 0
0 0 0 1577088 2076 151568 0 0 0 0 28 41 0 0 100 0 0
[root@lz-01 ~]#
- 以上vmstat后1 每隔一秒; 5 输出5次, 不加则一直输出.
1.3 用top命令显示进程所占的系统资源
top命令用于动态监控进程所占系统资源,每隔3秒变一次. 会把占有系统资源(CPU,内存,磁盘I/O等)最高的放在最前面.
[root@lz-01 ~]# top
top - 15:57:10 up 1:34, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 100 total, 1 running, 99 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863252 total, 1568172 free, 135288 used, 159792 buff/cache
KiB Swap: 3905532 total, 3905532 free, 0 used. 1555844 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5816 root 20 0 300936 6492 5124 S 0.5 0.3 0:06.92 vmtoolsd
7221 root 20 0 0 0 0 S 0.5 0.0 0:00.95 kworker/0:0
1 root 20 0 125312 3720 2572 S 0.0 0.2 0:02.04 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.10 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:01.63 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:00.04 watchdog/0
12 root rt 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/1
13 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/1
14 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/1
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
- top重点查看是进程使用系统资源的详细情况, 需要关注%Cpu (使用CPU百分比), %MEM (使用内存百分比), COMMAND (命令进程), RES (进程所占内存大小)
- 按数字 1 列出所有核CPU的使用状态
- M 按内存使用大小排序
- P 按CPU使用大小排序
- top - c 命令可以查看具体进程的命令
- top -bn1 一次性输出所有信息非动态显示
- kill PID 杀死进程
1.4 sar命令监控系统状态
sar命令几乎可以监控所有资源的状态,还可以打印历史信息, 可以显示当天从零点开始到当前时刻的系统状态信息. 如果系统这个命令不存在,需要安装sysstat包. yum install -y sysstat .
刚安装后sar会报错, sar工具还没有生成相应的数据库文件,默认数据文件在/var/log/sa 目录下.
查看网卡流量sar -n DEV
[root@lz-01 ~]# sar -n DEV 1 10
Linux 3.10.0-957.el7.x86_64 (lz-01) 2019年04月14日 _x86_64_ (2 CPU)
16时31分51秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
16时31分52秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时31分52秒 ens33 0.00 0.00 0.00 0.00 0.00 0.00 0.00
上例 是每隔 1 秒 打印10次
- IFACE: 这一列表示设备名称
- rxpck/s: 这一列表示每秒收取的包的数量;
- txpck/s: 表示每秒发送出去包的数量
- rxkB/s: 表示每秒收取的数据量; 单位KB
- txkB/s: 表示每秒发送的数据量, 单位KB
rxpck/s收取的数据包大于4000或者rxkB/s收取的数据量大于500万, 很可能被攻击, 除非自己在复制数据
可以使用 -f 选项查看某一天的网卡流量历史, 后面跟文件名.如下:
# sar -n DEV -f /var/log/sa/sa14
- 以上信息保留一个月. sa14 以当天日期命名
- 除生成sa14外, 第二天还会生成sar14. sa14为二进制文件, sar14可以cat直接查看
查看历史负载sar -q
[root@lz-01 ~]# sar -q
Linux 3.10.0-957.el7.x86_64 (lz-01) 2019年04月14日 _x86_64_ (2 CPU)
16时20分01秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
16时30分01秒 0 118 0.00 0.01 0.05 0
16时40分01秒 0 118 0.00 0.01 0.05 0
16时50分01秒 0 118 0.00 0.01 0.05 0
平均时间: 0 118 0.00 0.01 0.05 0
查看磁盘读写sar -b
可以查看磁盘读写情况
[root@lz-01 ~]# sar -b
Linux 3.10.0-957.el7.x86_64 (lz-01) 2019年04月14日 _x86_64_ (2 CPU)
16时20分01秒 tps rtps wtps bread/s bwrtn/s
16时30分01秒 0.06 0.00 0.06 0.00 0.78
16时40分01秒 0.04 0.00 0.04 0.00 0.61
16时50分01秒 0.05 0.00 0.05 0.00 0.57
平均时间: 0.05 0.00 0.05 0.00 0.65
1.5 查看网卡流量nload
系统默认没有nload命令,需要安装nload包, 安装nload包之前先安装epel-release包.
- 最上面一行为网卡名字以及IP地址, 按右箭头可以切换查看其它网卡流量.
- Incoming 进入网卡的流量
- Outgoing为网卡出去的流量
关注Curr那行的数据, 单位是动态自动调整; q退出
1.6 监控io性能
iostat 命令需要安装sysstat包.
iostat -x查看磁盘使用
[root@lz-01 ~]# iostat -x 1
Linux 3.10.0-957.el7.x86_64 (lz-01) 2019年04月14日 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.08 0.00 0.20 0.01 0.00 99.71
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
scd0 0.00 0.00 0.00 0.00 0.10 0.00 114.22 0.00 1.72 1.72 0.00 1.39 0.00
sda 0.00 0.02 0.45 0.20 20.72 7.53 87.46 0.00 2.69 2.61 2.87 1.15 0.07
- 关注 %util 表示I/O 等待时间所占CPU处理时间百分比
iotop查看磁盘使用
iotop 命令需要安装 yum install -y iotop
iotop也是动态显示的.
1.7 free命令查看内存使用情况
[root@lz-01 ~]# free
total used free shared buff/cache available
Mem: 1863252 136576 1399776 9708 326900 1545152
Swap: 3905532 0 3905532
默认单位是KB
- total: 内存总大小
- used: 真正使用的实际内存大小
- free: 剩余物理内存大小 (没有被分配,纯剩余)
- shared: 共享内存大小, 不用关注
- buff/cache: 分配给buffer 和 cache 的内存总大小
- available: 系统可使用内存的大小 .包含free, 包含被分配给某些应用的未被占用的 buffer 和 cache.
- total= used+free+buff/cache
free 命令可以使用 - m , -g 分别指定以MB和GB单位显示. -h选项以合适的单位显示
[root@lz-01 ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 133M 1.3G 9.5M 319M 1.5G
Swap: 3.7G 0B 3.7G
[root@lz-01 ~]#
1.8 ps命令查看系统进程
ps命令专门显示系统进程命令
[root@lz-01 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 125468 3844 ? Ss 14:22 0:02 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S 14:22 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 14:22 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 14:22 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 14:22 0:00 [kworker/u256:0]
root 7 0.0 0.0 0 0 ? S 14:22 0:00 [migration/0]
- PID: 表示进程的ID. kill PID 杀死进程
- STAT: 进程的状态
- D : 不能中断的进程 (通常为I/O)
- R(run) : 正在运行的进程, 包含等待CPU时间片的进程
- T : 已经停止或者暂停的进程
- W :没有足够的内存页分配
- X : 已经死掉的进程
- Z : 僵尸进程, 杀不掉,打不死的垃圾进程
- < : 高优先级进程
- N : 低优先级进程
- L : 在内存中被锁了内存分页
- s : 主进程
- l : 多线程进程
-
- : 在前台运行的进程
最大的区别就是:进程里包含了线程,线程是进程的子单元; 同一个进程下的线程全部共享相同的内存,而进程之间内存相互隔离。
1.9 netstat命令查看网络状况
首先确保安装net-tools包; yum install -y net-tools
netstat命令用来打印网络连接状况, 系统所开放的端口,路由表等信息.常用法如下;
netstat -lnp 打印当前系统启动了哪些端口
[root@lz-01 ~]# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6612/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6859/master
tcp6 0 0 :::22 :::* LISTEN 6612/sshd
tcp6 0 0 ::1:25 :::* LISTEN 6859/master
udp 0 0 127.0.0.1:323 0.0.0.0:* 5848/chronyd
udp6 0 0 ::1:323 :::* 5848/chronyd
raw6 0 0 :::58 :::* 7 6134/NetworkManager
netstat -ltnp 单独显示tcp端口
[root@lz-01 ~]# netstat -ltnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6612/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6859/master
tcp6 0 0 :::22 :::* LISTEN 6612/sshd
tcp6 0 0 ::1:25 :::* LISTEN 6859/master
netstat -lunp 单独显示udp端口
[root@lz-01 ~]# netstat -lunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 127.0.0.1:323 0.0.0.0:* 5848/chronyd
udp6 0 0 ::1:323 :::* 5848/chronyd
打印所有网络连接状态
netstat -an
或者
ss -an //不显示进程名字
小技巧;
netstat -an | awk '/^top/ {++sta[$NF]} END {for (key in sta) print key, "\t", sta[key]}'
2. linux下抓包工具
tcpdump抓包工具
默认没有安装, yum install -y tcpdump安装
[root@lz-01 ~]# tcpdump -nn -i ens33
20:35:47.888489 IP 192.168.253.128.22 > 192.168.253.1.62497: Flags [P.], seq 196684:197072, ack 53, win 320, length 388
- -i后边跟设备名称, 如果要抓取其他网卡的数据包,后面跟网卡的名字
- -nn选项作用是让第3列和第4列显示成"IP+端口号"的形式; 如果不加-nn, 则显示"主机名+服务名称"
以下是常用实例:
tcpdump -nn -i ens33 -c 100 // -c作用指定抓包数量, 抓够自动退出
tcpdump -nn -i ens33 port 22 //这样指定只抓22端口的
tcpdump -nn -i ens33 tcp and not port 22 //指定抓tcp的包,但不要22端口
tcpdump -nn -i ens33 port 22 and port53 //只抓22和53端口的包
tcpdump -nn -i ens33 -c 10 -w /tmp/1.cap // 抓10个包写入1.cap文件中
1.cap文件不能直接cat. 查看方法: tcpdump -r /tmp/1.cap
wireshark工具
实用方法:
[root@lz-01 ~]# tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src' -e "http.host" -e "http.request.method" -e "http.request.uri"
3. linux网络相关
3.1 ifconfig命令查看网卡IP
centos7默认没有安装, 需要yum install -y net-tools
[root@lz-01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.253.128 netmask 255.255.255.0 broadcast 192.168.253.255
inet6 fe80::d322:909e:d304:35e6 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:0a:82:8e txqueuelen 1000 (Ethernet)
RX packets 37119 bytes 32671554 (31.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 22617 bytes 3714700 (3.5 MiB)
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 1000 (Local Loopback)
RX packets 32 bytes 2592 (2.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 32 bytes 2592 (2.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- ip add 可以查看网卡
- ifconfig -a 选项可查看所有网卡, 包含down的网卡
- ifdown 停用网卡
- ifup 启动网卡
重启网卡:
ifdown ens33 && ifup ens33
或者: systemctl restart network重启网卡