跳到主要内容

服务器监控

内存

vmstat

vmstat  1 3

参数说明:上面表示每1秒输出一次,一共3次打印。

image-1713571681528

  • procs:进程信息统计,包括正在运行的进程数(r)和处于阻塞状态的进程数(b)。

  • memory:内存使用情况统计,包括交换空间使用量(swpd)、空闲内存量(free)、用于缓存的内存量(buff)和用于缓存文件系统的内存量(cache)。

  • swap:交换空间使用情况统计,包括每秒从磁盘交换到内存的数据量(si)和每秒从内存交换到磁盘的数据量(so)。

  • io:磁盘IO操作情况统计,包括每秒从磁盘读取的数据量(bi)和每秒写入磁盘的数据量(bo)。

  • system:系统调用信息统计,包括每秒的中断次数(in)和每秒的上下文切换次数(cs)。

  • cpu:CPU活动统计,包括用户进程使用CPU的时间比例(us)、系统进程使用CPU的时间比例(sy)和CPU空闲时间比例(id)。

网络

iftop

安装

yum install epel-release
yum -y install iftop

使用

指定网卡

iftop -i eth0 -n -P
  • -i 指定需要检测的网卡, 如果有多个网络接口,则需要注意网络接口的选择,如:# iftop -i eth0,默认是选择第一块网卡
  • -B 将输出以 byte 为单位显示网卡流量,默认是 bit
  • -n 将输出的主机信息都通过 IP 显示,不进行 DNS 解析
  • -N 只显示连接端口号,不显示端口对应的服务名称
  • -F 显示特定网段的网卡进出流量 如: iftop -F 192.168.85.0/24
  • -h 帮助,显示参数信息
  • -p 以混杂模式运行 iftop,此时 iftop 可以用作网络嗅探器
  • -P 显示主机以及端口信息
  • -m 设置输出界面中最上面的流量刻度最大值,流量刻度分 5 个大段显示 如:# iftop -m 100M
  • -f 使用筛选码选择数据包来计数 如 iftop -f filter code
  • -b 不显示流量图形条
  • -c 指定可选的配置文件,如:iftop -c config file
  • -t 使用不带 ncurses 的文本界面,
  • 以下两个是只和 -t 一起用的:
  • -s num num 秒后打印一次文本输出然后退出,-t -s 60 组合使用,表示取 60 秒网络流量输出到终端
  • -L num 打印的行数
  • -f 参数支持 tcpdump 的语法,可以使用各种过滤条件。

tcpdump

根据ip过滤

源ip过滤

tcpdump -i eth0 src 125.120.188.169

显示所有

tcpdump src host  125.120.188.169

目标ip过滤

tcpdump -i eth0 dst 125.120.188.169

网段过滤

tcpdump net 125.120.188.0/24
tcpdump src net 192.168
tcpdump dst net 192.168

监听网卡

tcpdump -i eth0

监听端口

tcpdump tcp port 80
tcpdump src port 8088
tcpdump dst port 8088
tcpdump port 80 or port 8088
tcpdump portrange 8000-8080
tcpdump src portrange 8000-8080
tcpdump dst portrange 8000-8080

监听指定协议

tcpdump icmp

ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui

数据包

08:26:25.533310 IP 172.20.20.1.36948 > 100.100.0.5.http: Flags [P.], ack 337, win 237, length 0
  • 第一列:时分秒毫秒 08:26:25.533310。
  • 第二列:网络协议 IP。
  • 第三列:发送方的ip地址+端口号,其中172.20.20.1是 ip,而 36948 是端口号
  • 第四列:箭头 >, 表示数据流向。
  • 第五列:接收方的ip地址+端口号,其中 100.100.0. 是 ip。
  • 第六列:冒号
  • 第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多标识符见下面
    • [S] : SYN(开始连接)
    • [P] : PSH(推送数据)
    • [F] : FIN (结束连接)
    • [R] : RST(重置连接)
    • [.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG)

抓包案例

提取User-Agent 和主机名

tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'

获取Get请求

tcpdump -vvAls0 | grep 'GET'

获取Post请求

tcpdump -vvAls0 | grep 'POST'

找出发包数最多的 IP

tcpdump -nnn -t -c 20000 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20

sar

得到所有数据

sar -A

实时监控网络IO

sar -n TCP 1 5

speedtest-cli

网络测速

sudo yum install -y  speedtest-cli
speedtest-cli

磁盘

创建Swap

挂载

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon -s
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

释放

swapoff /swapfile
rm -rf /swapfile
swapon -s

dd

磁盘测速

查看磁盘的读写速度

dd if=/dev/zero of=/dev/null bs=1k count=5000k
dd if=/dev/zero of=/data/tmp/t bs=1k count=5000k

iotop

查看应用程序的IO情况

yum install -y iotop
iotop

iostat

查看所有磁盘的读写

sudo yum install sysstat
iostat -x 1 10

查看是否固态

grep ^ /sys/block/*/queue/rotational

0表示是固态,1表示机械。

CPU

频率查看

cat /proc/cpuinfo | grep -i "cpu mhz"

perf

安装

yum install -y perf

查看指定程序CPU调用

perf trace -p $(pgrep mysqld)

查看CPU调度器统计信息

perf sched record --  sleep 10
perf sched latency
perf sched timehist

top

htop

系统调用汇总

perf trace -s -p $(pgrep mysqld)

查看程序的IO调用情况

perf trace -e sendto -p $(pgrep mysqld)

系统调用

strace

程序系统调用统计

系统调用跟踪

strace -c dd if=/dev/zero of=/dev/null bs=1k count=5000k

压测

stress-ng

安装

sudo yum install stress-ng

参数说明

-h,--help:显示帮助信息;

--version:显示版本信息;

-t,–timeout:指定程序运行结束的时间,后面直接跟数字,单位为秒;

-c,–-cpu:后面空格跟一个整数,表示测试CPU的进程数,--cpu 4 :表示生成4个worker循环调用sqrt()产生cpu压力;

-i,--io:后面空格跟一个整数,表示测试磁盘I/O的进程数, --io 4 :表示生成4个worker循环调用sync()产生io压力;

-m,--vm:后面空格跟一个整数,表示测试内存的进程数,--vm 4 :表示生成4个worker循环调用malloc()/free()产生内存压力;

-d,--hdd:后面空格直接跟数字,表示产生执行write和unlink函数的进程数,用于磁盘负载测试;

--cpu-method:指定CPU的测试方法,后面空格直接跟方法名;

--metrics:输出命令执行指标;

--vm-bytes:指定在内存测试时malloc的字节数,默认256M;

--class:指定测试类别,后面空格跟类别名;

--matrix:启用矩阵测试模式,后面空格跟矩阵模式名;

--random-seed:指定测试随机种子,后面空格跟种子名;

--sequential:启用顺序测试模式;

--hdd-bytes:指定写的字节数;

--cpu-load:CPU负载占比,后面空格直接跟数字,单位为百分比;

#### 案例

CPU压测

stress-ng --cpu 4 --cpu-method matrixprod --timeout 20s

使用 4 个 CPU 进程数,进行矩阵乘法计算以进行压力测试,持续时间为20秒

stress-ng -c 2 --cpu-method pi --timeout 20s

产生 2 个 worker 做圆周率算法压力

stress-ng -c 2 --cpu-method all --timeout 20s

产生 2 个 worker 迭代使用 30 多种不同的压力算法,包括pi, crc16, fft等等

stress-ng --sock 2 --timeout 20s

产生 2 个 worker 调用 socket 相关函数产生压力

stress-ng --tsc 2 --timeout 20s

产生 2 个 worker 读取 tsc 产生压力

stress-ng --tsc 2 --taskset 0 --timeout 20s

将压力指定到特定的cpu 0上

内存压测

stress-ng --vm 4 --vm-bytes 512M --timeout 20s

用 4 个内存分配进程, 每次分配大小512M,分配后不释放,保持测试20秒

IO负载压测

stress-ng --io 4 --timeout 20s

使用 4 个 IO 进程 ,保持测试20秒

磁盘IO压测

stress-ng --io 4 --hdd 1 --hdd-bytes 1G --timeout 20s

使用 4 个I/O进程, 1 个写进程,每次写1G 文件块,测试20秒


### siege
#### 安装
```
wget http://download.joedog.org/siege/siege-3.0.8.tar.gz

tar xzvf siege-3.0.8.tar.gz

cd siege-3.0.8

./configure

make && make install
```

#### 执行
```shell
siege www.linuxidc.com/test.php -b -r10 -c400
```

#### 参数说明
- -b 每次request之间没有延迟,还有一个-d参数加上延迟,类似于一些专业测试工具的思考时间。
- -r 每次请求执行多少次。
- -c 并发用户。