使用w查看系统负载
[root@mingming ~]# w 05:17:51 up 2 min, 2 users, load average: 0.04, 0.06, 0.02USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 - 05:17 31.00s 0.02s 0.02s -bash root pts/0 192.168.23.1 05:17 0.00s 0.00s 0.00s w
第一行从左面开始显示的信息依次为:时间,系统运行时间,登录用户数,平均负载。第二行开始以及下面所有的行,告诉我们的信息是,当前登录的都有哪些用户,以及他们是从哪里登录的等等
load average 第一个数值表示1分钟内系统的平均负载值;第二个数值表示5分钟内系统的平均负载值;第三个数值表示15分钟系统的平均负载值
cat /proc/cpuinfo 查看CPU逻辑个数
vmstat命令
[root@mingming ~]# vmstat 1 5procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 871076 12284 66804 0 0 43 2 32 43 0 0 99 1 0 0 0 0 871068 12284 66804 0 0 0 0 44 59 0 0 100 0 0 0 0 0 871068 12284 66804 0 0 0 0 39 61 0 0 100 0 0 0 0 0 871068 12284 66804 0 0 0 0 40 61 0 1 100 0 0 0 0 0 871068 12284 66804 0 0 0 0 39 63 0 0 100 0 0
vmstat 1 5 每1秒显示一次 显示5次
1)procs 显示进程相关信息
r :run表示运行和等待cpu时间片的进程数,如果长期大于服务器cpu的个数,则说明cpu不够用了;
b :block 表示等待资源的进程数,比如等待I/O, 内存等,这列的值如果长时间大于1,则需要关注一下了;
2)memory 内存相关信息
swpd :表示切换到交换分区中的内存数量 ;
free :当前空闲的内存数量;
buff :缓冲大小,(即将写入磁盘的);
cache :缓存大小,(从磁盘中读取的);
3)swap 内存交换情况
si :swap in由交换区写入到内存的数据量;
so :swap out由内存写入到交换区的数据量;
4)io 磁盘使用情况
bi :从块设备读取数据的量(读磁盘);
bo: 从块设备写入数据的量(写磁盘);
5)system 显示采集间隔内发生的中断次数
in :表示在某一时间间隔中观测到的每秒设备中断数;
cs :表示每秒产生的上下文切换次数;
6)CPU 显示cpu的使用状态
us :显示了用户下所花费 cpu 时间的百分比;
sy :显示系统花费cpu时间百分比;
id :表示cpu处于空闲状态的时间百分比;
wa :表示I/O等待所占用cpu时间百分比;
st :表示被偷走的cpu所占百分比(一般都为0,不用关注);
以上所介绍的各个参数中,阿铭经常会关注r列,b列,和wa列,三列代表的含义在上边说得已经很清楚。IO部分的bi以及bo也是要经常参考的对象。如果磁盘io压力很大时,这两列的数值会比较高。另外当si, so两列的数值比较高,并且在不断变化时,说明内存不够了,内存中的数据频繁交换到交换分区中,这往往对系统性能影响极大。
top命令
[root@localhost ~]# top top - 16:31:49 up 4:42, 3 users, load average: 0.02, 0.05, 0.00Tasks: 74 total, 1 running, 73 sleeping, 0 stopped, 0 zombieCpu(s): 1.4%us, 7.8%sy, 0.0%ni, 89.2%id, 1.0%wa, 0.3%hi, 0.3%si, 0.0%stMem: 326616k total, 321172k used, 5444k free, 23664k buffersSwap: 2097144k total, 588k used, 2096556k free, 227416k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND11194 root 20 0 43936 36m 1128 S 3.8 11.3 2:38.95 perl 5373 root 20 0 2572 1072 860 R 0.6 0.3 0:00.05 top24160 root 20 0 12412 2124 1376 S 0.3 0.7 0:01.12 sshd 1 root 20 0 2900 800 652 S 0.0 0.2 0:01.52 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
每隔3秒变一次。这个命令的特点是把占用系统资源(CPU,内存,磁盘IO等)最高的进程放到最前面
M 内存排序
P CPU排序
在 top 状态下,按 “shift + m”, 可以按照内存使用大小排序。按数字 ‘1’ 可以列出各颗cpu的使用状态。
top -c 查看进程路径
top -bn1 它表示非动态打印系统资源使用情况,可以用在shell脚本中:
sar命令
yum install -y sysstat
sar -n DEV 1 10 网卡流量
[root@mingming ~]# sar -n DEV 1 5 Linux 2.6.32-431.el6.i686 (mingming) 2017年07月11日 _i686_ (2 CPU)06时21分48秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s06时21分49秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.0006时21分49秒 eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sar -q 系统负载
sar -b 磁盘读写
sar -f /var/log/sa/saxx 历史文件
nload 命令 直观动态流量查询
yum install -y epel-release
yum install -y nload
监控io性能
[root@mingming ~]# iostat -xLinux 2.6.32-431.el6.i686 (mingming) 2017年07月12日 _i686_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 1.37 0.00 2.49 6.50 0.00 89.64Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await r_await w_await svctm %util scd0 0.00 0.00 0.38 0.00 3.07 0.00 8.00 0.00 1.04 1.04 0.00 1.04 0.04sda 20.93 2.32 35.66 1.73 1406.03 32.38 38.48 0.20 5.40 5.34 6.62 3.54 13.24
主要看%util百分比:为等待读或写去磁盘的百分比 ##iotop
yum install -y iotop
iotop 进程使用io排序
free命令
查看内存使用
只需要敲一个 free 然后回车就可以当前系统的总内存大小以及使用内存的情况。从上例中可看到当前系统内存总大小为326616(单位是k)已经使用137332, 剩余189284. 其实真正剩余并不是这个189284, 而是第二行的297100, 真正使用的也是第二行的29516, 这是因为系统初始化时,就已经分配出很大一部分内存给缓存,这部分缓存用来随时提供给程序使用,如果程序不用,那这部分内存就空闲。所以,查看内存使用多少,剩余多少请看第二行的数据。另外我们还可以加-m 或者-g选项分别以M或G为单位打印内存使用状况:
[root@mingming ~]# free -m total used free shared buffers cached Mem: 1006 439 566 0 19 338-/+ buffers/cache: 82 924Swap: 2047 0 2047
. ps 查看系统进程
[root@mingming ~]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 2900 1420 ? Ss 04:21 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 04:21 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 04:21 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S 04:21 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S 04:21 0:00 [migration/0] root 6 0.0 0.0 0 0 ? S 04:21 0:00 [watchdog/0] root 7 0.0 0.0 0 0 ? S 04:21 0:00 [migration/1] root 8 0.0 0.0 0 0 ? S 04:21 0:00 [migration/1] root 9 0.0 0.0 0 0 ? S 04:21 0:00 [ksoftirqd/1] root 10 0.0 0.0 0 0 ? S 04:21 0:00 [watchdog/1]
阿铭也经常看到有的人喜欢用 ps -elf 大同小异,显示的信息基本上是一样的。ps命令还有更多的用法,阿铭不再做介绍,因为你只要会用这个命令就足够了,请man一下。下面介绍几个参数的意义。
PID :进程的id,这个id很有用,在linux中内核管理进程就得靠pid来识别和管理某一个程,比如我想终止某一个进程,则用 ‘kill 进程的pid 有时并不能杀掉,则需要加一个-9选项了 kill -9 进程pid
STAT :表示进程的状态,进程状态分为以下几种(不要求记住,但要了解)
D 不能中断的进程(通常为IO)
R 正在运行中的进程
S 已经中断的进程,通常情况下,系统中大部分进程都是这个状态
T 已经停止或者暂停的进程,如果我们正在运行一个命令,比如说 sleep 10 如果我们按一下ctrl -z 让他暂停,那么我们用ps查看就会显示T这个状态
W 这个好像是说,从内核2.6xx 以后,表示为没有足够的内存页分配
X 已经死掉的进程(这个好像从来不会出现)
Z 僵尸进程,杀不掉,打不死的垃圾进程,占系统一小点资源,不过没有关系。如果太多,就有问题了。一般不会出现。
< 高优先级进程
N 低优先级进程
L 在内存中被锁了内存分页
s 主进程
l 多线程进程
代表在前台运行的进程
这个ps命令是阿铭在工作中用的非常多的命令之一,所以请记住它吧。关于ps命令的使用,阿铭经常会连同管道符一起使用,用来查看某个进程或者它的数量。
查看网络状态
netstat 查看网络状态
[root@mingming ~]# netstatActive Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 64 192.168.23.128:ssh 192.168.23.1:60874 ESTABLISHEDActive UNIX domain sockets (w/o servers)Proto RefCnt Flags Type State I-Node Pathunix 2 [ ] DGRAM 7182 @/org/kernel/udev/udevdunix 2 [ ] DGRAM 9277 @/org/freedesktop/hal/udev_eventunix 2 [ ] DGRAM 8852 /var/run/portreserve/socket
netstat -lnp 查看监听端口
[root@mingming ~]# 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:5666 0.0.0.0:* LISTEN 1128/nrpe tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 979/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1107/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1208/master tcp 0 0 0.0.0.0:45625 0.0.0.0:* LISTEN 997/rpc.statd tcp 0 0 :::5666 :::* LISTEN 1128/nrpe tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1121/java tcp 0 0 :::8009 :::* LISTEN 1121/java tcp 0 0 :::111 :::* LISTEN 979/rpcbind tcp 0 0 :::80 :::* LISTEN 1121/java tcp 0 0 :::22 :::* LISTEN 1107/sshd tcp 0 0 :::48152 :::* LISTEN 997/rpc.statd tcp 0 0 ::1:25 :::* LISTEN 1208/master udp 0 0 0.0.0.0:730 0.0.0.0:* 979/rpcbind udp 0 0 0.0.0.0:45805 0.0.0.0:* 997/rpc.statd udp 0 0 0.0.0.0:111 0.0.0.0:* 979/rpcbind udp 0 0 127.0.0.1:755 0.0.0.0:* 997/rpc.statd udp 0 0 :::57296 :::* 997/rpc.statd
netstat -an 查看系统的网络链接状况
[root@mingming ~]# netstat -anActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 0.0.0.0:5666 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:111 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:22 0.0.0.0:* LISTENtcp 0 0 127.0.0.1:25 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:45625 0.0.0.0:* LISTENtcp 0 0 192.168.23.128:22 192.168.23.1:60874 ESTABLISHEDtcp 0 0 :::5666 :::* LISTENtcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTENtcp 0 0 :::8009 :::* LISTENtcp 0 0 :::111 :::* LISTENtcp 0 0 :::80 :::* LISTENtcp 0 0 :::22 :::* LISTENtcp 0 0 :::48152 :::* LISTENtcp 0 0 ::1:25 :::* LISTEN
netstst -lntp 只看tcp的 不包含socket
ss -an 和netstst 异曲同工
分享一个小技巧(查看每个状态的个数)
netstat -an |awk '/^tcp/{++sta[$NF]}END {for(key in sta)print key,"\t",sta[key]}'
Linux下抓包
有时候,也许你会有这样的需求,想看一下某个网卡上都有哪些数据包,尤其是当你初步判定你的服务器上有流量攻击。这时,使用抓包工具来抓一下数据包,就可以知道有哪些IP在攻击你了。
yum install -y tcpdump 命令去安装一下
tcpdump -nn
05:44:39.302222 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1564272:1564560, ack 17601, win 505, length 28805:44:39.303504 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1564560:1564736, ack 17601, win 505, length 17605:44:39.303725 IP 192.168.23.1.60874 > 192.168.23.128.22: Flags [.], ack 1564736, win 251, length 005:44:39.304498 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1564736:1565024, ack 17601, win 505, length 28805:44:39.305538 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1565024:1565200, ack 17601, win 505, length 17605:44:39.305721 IP 192.168.23.1.60874 > 192.168.23.128.22: Flags [.], ack 1565200, win 256, length 005:44:39.306528 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1565200:1565488, ack 17601, win 505, length 28805:44:39.307549 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1565488:1565664, ack 17601, win 505, length 17605:44:39.307866 IP 192.168.23.1.60874 > 192.168.23.128.22: Flags [.], ack 1565664, win 254, length 005:44:39.308467 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1565664:1565952, ack 17601, win 505, length 28805:44:39.309668 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1565952:1566128, ack 17601, win 505, length 17605:44:39.310075 IP 192.168.23.1.60874 > 192.168.23.128.22: Flags [.], ack 1566128, win 253, length 005:44:39.310173 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1566128:1566416, ack 17601, win 505, length 28805:44:39.311681 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1566416:1566592, ack 17601, win 505, length 17605:44:39.312270 IP 192.168.23.1.60874 > 192.168.23.128.22: Flags [.], ack 1566592, win 251, length 005:44:39.312384 IP 192.168.23.128.22 > 192.168.23.1.60874: Flags [P.], seq 1566592:1566880, ack 176
上例中第三列和第四列显示的信息为哪一个IP+port在连接哪一个IP+port,后面的信息是该数据包的相关信息,如果不懂也没有关系,毕竟我们不是专门搞网络的,而这里需要关注的只是第三列以及第四列。-i 选项后面跟设备名称,如果你想抓eth1网卡的包,后面则要跟eth1.至于-nn选项的作用是让第三列和第四列显示成IP+端口号的形式,如果不加-nn则显示的是主机名+服务名称。
tcpdump -nn -i ens33
tcpdump -nn port 80
tcpdump -nn not prot 22 and host 192.168.23.128
tcpdump -nn -c 100 -w 1.cap
tcpdump -r 1.cap 查看保存的包 抓100个包存到1.cap文件中
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" 查看指定网卡80端口web动态
yum install -y wireshark