常用Linux网络/内存/磁盘分析工具

网络IO

  1. sar -n DEV 1 3 监控网卡IO
  2. ethtool 网卡名 查看网卡的最大速率等参数信息
  3. netstat -nat | awk 'FNR>2{print $NF}' | sort | uniq -c 查看系统TIME_WAIT状态连接数
  4. 查看DND信息dig命令
    1
    2
    3
    dig baidu.com # 输出host的cname记录与A记录,可以看到ip地址和使用的DNS服务器信息,添加` +short`可以简化输出
    dig -x 204.152.184.167 +short # 用 -x的选项查找IP地址的主机名
    dig @ns1.google.com www.google.com 指定查询的DNS server

tcpdump

1
2
3
4
5
6
7
8
9
10
11
12
   tcpdump -D # 显示可以抓取的所有网络接口
# 抓取9100端口,网卡xgbe0的TCP网络包信息,保存到aaa.pcap
tcpdump tcp port 9100 -i xgbe0 -nn -s 0 -XX -w aaa.pcap

# 指定目的或者源ip,可以使用and,or
tcpdump -i eth0 src and dst 172.16.11.1 and port 80 -nn -s 0 -XX -w aaa.pcap

# 指定主机
tcpdump -i eth0 host 172.16.11.1 and port 80 -nn -s 0 -XX -w aaa.pcap

# 抓取http包,一般是eth0,xgbe0,可以加上port 80作为条件,这里是指本机接收http请求的80端口,发出端口为随机
tcpdump -i xgbe0 -nn -s 0 -XX -w yq41.pcap

wireshark分析网络包

  1. tcpdump保存的文件是二进制的文件,需要下载到本地用wireshark查看
  2. 过滤器:tcp.stream
  3. 抓包参数和结果解析

CPU

  1. mpstat -P ALL 1 1 查看cpu占用率波动情况;也可以top,然后1
  2. taskset绑定进程或者线程到指定CPU的核

    1
    2
    3
    4
    5
    taskset -cp pid   查看进程所属核
    taskset -acp pid 查看进程及所有线程的所属核
    taskset -pc 3 pid 表示将进程pid绑定到第3个核上
    taskset -a -pc 3 pid 表示将进程pid(包括所有线程)绑定到第3个核上
    taskset -cp 1,2,3 pid
  3. pidstat 用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 查看CPU
    pidstat -p pid 3 3
    # 查看进程内存状态,用ps效果一样,RSS单位为KB
    pidstat -r -p 26716 3 3
    # 查看进程磁盘IO
    pidstat -d -p 26716 3 3
    # 查看进程上下文切换
    pidstat -wt -p 26716 3 3
    # 查看进程中的线程信息
    pidstat -t -p 26716 3 3
  4. vmstat 2 1 查看系统上下文切换

内存

top

  1. top命令常用参数
  2. P,M分别是按cpu和内存排序;mac系统使用o + 列名
  3. sar -u 1 3 监控CPU状态
  4. top -p 345 查看指定pid=345的进程,在mac中用-pid代替-p
  5. %cpu参数不可靠,需要1查看每个CPU的使用率才可靠

free

-g```:以GB为显示单位,也可以-m以MB为显示单位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

name | total | used | free | shared | buffers |cached
--- | --- | --- | --- | --- | --- | ---
Mem: | 125 | 125 | 0 | 0 | 0 | 109 |
-/+ buffers/cache: | | 15(上一行的used - buffers - cached) | 110(上一行的 free + buffers + cached)
Swap: | 0 | 0 | 0

对操作系统来讲,为了内存利用率最大化,会把剩余内存申请为cached,所以系统运行时间长了,cached就会比较大,对于频繁读写的系统就更加明显。used 和 free都是Mem的参数,所以 buffers/cached这两项对于操作系统来讲都是已经被使用的内存,所以呢 free的就比较少;

而对于应用程序来说呢,buffers/cached等同于可用的内存,因为buffers/cached可提高程序执行的性能,当程序使用内存时,buffers/cached很快就会被使用。

所以从应用程序的角度来看,应以(-/+ buffers/cached)的free 和 used为主,即我们主要与他相关的free和used就可以了

我们在观察Linux的内存使用情况时,只要没发现用swap的交换空间,就不必担心自己的内存太少。如果常常看到swap用了很多,那么你就要考虑加物理内存了,可以用`vmstat`查看swap IO状况。这也是在Linux服务器上看内存是否够用的标准。因为swap用的多,说明OS把本应该存在物理内存中的部分内存页调度到了磁盘,腾出空间给当前进程使用,等到其他进程运行时才会把这部分内存页再次调度到物理内存。

#### buffer/cache/shared memory区别与联系

#### pmap
1. 查看进程内存分布状况,可以用来分析线程堆栈:`pmap -d 12345 # 12345 是进程号`

#### 清理linux cache
Kernels 2.6.16 and newer provide a mechanism to have the kernel drop the page cache and/or inode and dentry caches on command, which can help free up a lot of memory.

This is a non-destructive operation and will only free things that are completely unused. Dirty objects will continue to be in use until written out to disk and are not freeable. If you run "sync" first to flush them out to disk, these drop operations will tend to free more memory.

To free pagecache:
# echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:
# echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches


> 遇到报错: ```tcpdump: can't create rx ring on packet socket: cannot allocate memory```, 可以使用该命令清除cache



### 磁盘IO

#### 磁盘IOPS和Throughput

1. 磁盘的 IOPS,也就是在一秒内磁盘进行多少次 I/O 读写。磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。每秒 I/O 吞吐量= IOPS* 平均 I/O SIZE
2. 随机读写频繁的应用,如OLTP(Online Transaction Processing),IOPS是关键衡量指标;对于大量顺序读写的应用,如VOD(Video On Demand),则更关注吞吐量指标。

#### 影响IOPS的因素

1. 第一个**寻址时间**,考虑到被读写的数据可能在磁盘的任意一个磁道,既有可能在磁盘的最内圈(寻址时间最短),也可能在磁盘的最外圈(寻址时间最长),所以在计算中我们只考虑平均寻址时间,也就是磁盘参数中标明的那个平均寻址时间,这里就采用当前最多的10krmp硬盘的5ms。
2. 第二个**旋转延时**,和寻址一样,当磁头定位到磁道之后有可能正好在要读写扇区之上,这时候是不需要额外额延时就可以立刻读写到数据,但是最坏的情况确实要磁盘旋转整整一圈之后磁头才能读取到数据,所以这里我们也考虑的是平均旋转延时,对于10krpm的磁盘就是(60s/10k)*(1/2) = 2ms。
3. 第三个**传送时间**,磁盘参数提供我们的最大的传输速度,当然要达到这种速度是很有难度的,但是这个速度却是磁盘纯读写磁盘的速度,因此只要给定了单次 IO的大小,我们就知道磁盘需要花费多少时间在数据传送上,这个时间就是IO Chunk Size / Max Transfer Rate。

#### I/O 读写的类型

大体上讲,I/O 的类型可以分为:读 / 写 I/O、大 / 小块 I/O、连续 / 随机 I/O, 顺序 / 并发 I/O。在这几种类型中,我们主要讨论一下:大 / 小块 I/O、连续 / 随机 I/O, 顺序 / 并发 I/O。

##### 大 / 小块 I/O

这个数值指的是控制器指令中给出的连续读出扇区数目的多少。如果数目较多,如 64,128 等,我们可以认为是大块 I/O;反之,如果很小,比如 4,8,我们就会认为是小块 I/O,实际上,在大块和小块 I/O 之间,没有明确的界限。

##### 连续 / 随机 I/O

连续 I/O 指的是本次 I/O 给出的初始扇区地址和上一次 I/O 的结束扇区地址是完全连续或者相隔不多的。反之,如果相差很大,则算作一次随机 I/O

连续 I/O 比随机 I/O 效率高的原因是:在做连续 I/O 的时候,磁头几乎不用换道,或者换道的时间很短;而对于随机 I/O,如果这个 I/O 很多的话,会导致磁头不停地换道,造成效率的极大降低。

##### 顺序 / 并发 I/O

从概念上讲,并发 I/O 就是指向一块磁盘发出一条 I/O 指令后,不必等待它回应,接着向另外一块磁盘发 I/O 指令。对于具有条带性的 RAID(LUN),对其进行的 I/O 操作是并发的,例如:raid 0+1(1+0),raid5 等。反之则为顺序 I/O。



#### [磁盘I/O那些事](https://tech.meituan.com/about_desk_io.html)



#### [Linux下的IO监控与分析](https://www.cnblogs.com/quixotic/p/3258730.html)

1. `iostat -xm 1 1`: 监控CPU状态和磁盘IO
2. [iostat命令输出详解](http://www.cnblogs.com/peida/archive/2012/12/28/2837345.html)



### 系统端口占用信息和进程信息

- ```lsof | grep pid/pname``` 查看进程信息
- ```lsof -i:port```查看端口号port使用的进程号和连接情况
- ```lsof -i@ip:port```使用@host:port来显示指定到指定主机的连接
- ```lsof -iTCP```显示TCP连接
- ```lsof -c abc``` 显示 abc 进程现在打开的文件
- ```lsof -p 12``` 看进程号为 12 的进程打开了哪些文件
- ```netstat -np/c/atux | grep pid/port/pname```查看进程号所占用的端口号和端口占用情况
- `netstat -n | grep tcp | grep 侦听端口 | wc -l` : 监听端口连接数
- `netstat -nat | grep 3306 -c` : 查看数据库连接使用数目
- ```ps aux```只能看到pid等信息,不能看到端口号
- `ps -eLf | grep java | wc -l`: 监控java进程的线程数, 或者`ps -eLf | grep 27955 -c`
- `ps -eo pid,pcpu | sort -rn -k 2 | less` 查看CPU高占用的进程pid
- `ps H -eo pid,tid,pcpu | sort -rn -k 3 | less` 查看CPU高占用的pid及线程id
- `cat /proc/进程号/task/线程号/status` 查看线程具体信息
- `printf "%x\n" 7444` 线程id转成十六进制,可以用于jstack dump信息的搜索id
- 远程登录 `telnet hostname`

### sar命令查看网络、磁盘、CPU、内存信息
sar - Collect, report, or save system activity information.

参数说明

-A 汇总所有的报告
-a 报告文件读写使用情况
-B 报告附加的缓存的使用情况
-b 报告缓存的使用情况
-c 报告系统调用的使用情况
-d 报告磁盘的使用情况
-g 报告串口的使用情况
-h 报告关于buffer使用的统计数据
-m 报告IPC消息队列和信号量的使用情况
-n 报告命名cache的使用情况
-p 报告调页活动的使用情况
-q 报告运行队列和交换队列的平均长度
-R 报告进程的活动情况
-r 报告没有使用的内存页面和硬盘块
-u 报告CPU的利用率
-v 报告进程、i节点、文件和锁表状态
-w 报告系统交换活动状况
-y 报告TTY设备活动状况

系统平均load负载

sar -q 2 2

参数:
runq-sz:运行队列的长度(等待CPU时间片来运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
ldavg-1:最后1分钟的系统平均负载 ldavg-5:过去5分钟的系统平均负载
ldavg-15:过去15分钟的系统平均负载

查看内存信息

sar -r 1 3

参数解释:
kbmemfree:剩余可用内存、单位K
kbmemused:已用内存、以K 为单位、该值不考虑内核自身所使用的内存
%memused:已用内存百分比
kbbuffers:已用buffer(内核所用)、单位K
kbcached:已用cache(内核所用)、单位K
kbswpfree:剩余Swap、单位K
kbswpused:已用Swap、单位K
%swpused:已用Swap百分比
kbswpcad:被缓存的Swap、单位K

内存分页统计

sar -B 5 3

参数解释:

pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.

系统交换活动状况

sar -w 1 3

参数:
pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量

CPU信息

sar -u 3 5

参数解释:

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比
%nice:显示在用户级别,通过nice改变了进程调度优先级的进程,在用户模式下消耗的CPU时间的比例
%system:在内核级别(kernel)运行所使用 CPU 总时间的百分比
%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比

1)若 %iowait 的值过高(大于0的长时间值),表示硬盘或者网络存在I/O瓶颈
2)若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
3)若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU

磁盘信息

sar -b 3 5

tps:每秒磁盘的 I/O 传输总量
rtps:每秒从磁盘读出的数据总量
wtps:每秒向磁盘写入的数据总量
bread/s:每秒从磁盘读出的数据量,单位为 块/s
bwrtn/s:每秒向磁盘写入的数据量,单位为 块/s

网络IO

sar -n DEV 2 3

监控TCP连接状态

sar -n TCP/ETCP 1

active/s: 每秒本地发起的TCP连接数,即服务器通过connect调用创建的TCP连接数
passive/s: 每秒远程发起的TCP连接数,即服务器通过accept调用创建的连接数
retrans/s: 每秒重传数量

1
2
3

### Linux /proc目录
在Linux系统“一切都是文件”的思想贯彻指导下,所有进程的运行状态都可以用文件来获取。系统根目录/proc中,每一个数字子目录的名字都是运行中的进程的PID,进入任一个进程目录,可通过其中文件或目录来观察进程的各项运行指标,例如task目录就是用来描述进程中线程的

可以通过下面的方法获取某进程中运行中的线程数量(PID指的是进程ID)

ls /proc/PID/task | wc -l

获取进程相关信息

cat /proc/PID/status

获取内存信息

vmstat -s -S M
cat /proc/meminfo

CPU信息

cat /proc/cpuinfo

调整TCP receive窗口大小

浅谈TCP参数优化

/sbin/sysctl net.ipv4.tcp_rmem
cat /proc/sys/net/ipv4/tcp_rmem
```

Linux单机性能评估和优化

  1. Linux服务器性能评估与优化(一)
  2. Linux服务器性能评估与优化(二)

单机性能主要包括CPU、内存、网络IO、磁盘IO几个方面,互相依赖,互相影响。例如,网卡巨量吞吐或者磁盘频繁读写都可能导致CPU系统调用过高而占用率很高。CPU一般认为user%+sys%<70%为良好状态,内存一般认为si和swap out都为0为良好状态,磁盘认为iowait%<20%为良好状态