Linux监控优化
高并发配置
max_map_count
进程可以拥有的 VMA(虚拟内存区域)的数量。将该值调整为 262144:
# 修改配置文件。
cat >> /etc/sysctl.conf << EOF
vm.max_map_count = 262144
EOF
# 使修改生效。
sysctl -p
echo 120000 > /proc/sys/kernel/threads-max
echo 200000 > /proc/sys/kernel/pid_max
NTP 设置
您可以使用 pool.ntp.org 提供的互联网时间服务,也可以使用离线环境内置的 NTP 服务。例如,您可以使用云服务提供商提供的 NTP 服务。
- 查看 NTP 时间服务器或 Chrony 服务是否存在。
rpm -qa | grep ntp
systemctl status chrony
- 如不存在,运行以下命令安装 NTP 时间服务器。
sudo yum install ntp ntpdate && \
sudo systemctl start ntpd.service && \
sudo systemctl enable ntpd.service
- 检查 NTP 服务。
systemctl list-unit-files | grep ntp
- 检查 NTP 服务连接和监控状态。
netstat -tunlp | grep ntp
- 检查服务是否与 NTP 服务器同步。
ntpstat
- 检查网络中的 NTP 服务器。
ntpq -p
查看文件系统
df -Th
ulimit 设置
如果最大文件描述符和最大用户进程的值设置得过小,建议您将系统资源上限调大。
cat >> /etc/security/limits.conf << EOF
* soft nproc 65535
* hard nproc 65535
* soft nofile 655350
* hard nofile 655350
* soft stack unlimited
* hard stack unlimited
* hard memlock unlimited
* soft memlock unlimited
EOF
cat >> /etc/security/limits.d/20-nproc.conf << EOF
* soft nproc 65535
root soft nproc 65535
EOF
时区
cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock
LANG 变量
# 修改配置文件。
echo "export LANG=en_US.UTF8" >> /etc/profile
# 使修改生效。
source /etc/profile
防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
SELinux
建议您禁用 SELinux。
# 临时变更。
setenforce 0
# 永久变更。
sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
sed -i 's/SELINUXTYPE/#SELINUXTYPE/' /etc/selinux/config
内存
Memory Overcommit
# 修改配置文件。
cat >> /etc/sysctl.conf << EOF
vm.overcommit_memory=1
EOF
# 使修改生效。
sysctl -p
Memory Overcommit 允许操作系统将额外的内存资源分配给进程。建议您启用 Memory Overcommit。
内存大页
查看内存页面大小
getconf PAGE_SIZE
查看是否开启了大页
grep -i HugePages_Total /proc/meminfo
如果 HugePages_Total 为 0,意味着 Linux 没有设置或没有启用 Huge pages。
关闭内存大页
# 临时变更。
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
# 永久变更。
cat >> /etc/rc.d/rc.local << EOF
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF
chmod +x /etc/rc.d/rc.local
vmstat
vmstat 1 3
参数说明:上面表示每1秒输出一次,一共3次打印。

-
procs:进程信息统计,包括正在运行的进程数®和处于阻塞状态的进程数(b)。
-
memory:内存使用情况统计,包括交换空间使用量(swpd)、空闲内存量(free)、用于缓存的内存量(buff)和用于缓存文件系统的内存量(cache)。
-
swap:交换空间使用情况统计,包括每秒从磁盘交换到内存的数据量(si)和每秒从内存交换到磁盘的数据量(so)。
-
io:磁盘IO操作情况统计,包括每秒从磁盘读取的数据量(bi)和每秒写入磁盘的数据量(bo)。
-
system:系统调用信息统计,包括每秒的中断次数(in)和每秒的上下文切换次数(cs)。
-
cpu:CPU活动统计,包括用户进程使用CPU的时间比例(us)、系统进程使用CPU的时间比例(sy)和CPU空闲时间比例(id)。
网络
tcp_abort_on_overflow
如果系统当前因后台进程无法处理的新连接而溢出,则允许系统重置新连接。
# 修改配置文件。
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_abort_on_overflow=1
EOF
# 使修改生效。
sysctl -p
somaxconn
设置监听 Socket 队列的最大连接请求数为 1024
# 修改配置文件。
cat >> /etc/sysctl.conf << EOF
net.core.somaxconn=1024
EOF
# 使修改生效。
sysctl -p
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
http访问延时
time curl www.baidu.com
磁盘
创建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
swapoff -a
rm -rf /swapfile
swapon -s
swappiness(swap使用率)
查看
cat /proc/sys/vm/swappiness
Swappiness 会对性能造成影响,因此建议您禁用 Swappiness。
# 修改配置文件。
cat >> /etc/sysctl.conf << EOF
vm.swappiness=0
EOF
# 使修改生效。
sysctl -p
swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存;参数值越高就是反过来,使内核更多的去使用swap空间。Ubuntu系统swappiness默认值为60,表示的含义可以这样来理解,当剩余物理内存低于40%(40=100-60)时,开始使用swap分区。CentOS系统此参数的默认值是30。我个人喜欢将作为服务器的Linux系统的swappiness参数设置为10。设置为100可能会影响整体性能,如果内存充足,就可以将这个值设置很低,甚至为0,以避免系统进行swap而影响性能。
磁盘调度算法
cat /sys/block/${disk}/queue/scheduler
# 例如,运行 cat /sys/block/vdb/queue/scheduler
SATA
# 临时变更。
echo mq-deadline | sudo tee /sys/block/${disk}/queue/scheduler
# 永久变更。
cat >> /etc/rc.d/rc.local << EOF
echo mq-deadline | sudo tee /sys/block/${disk}/queue/scheduler
EOF
chmod +x /etc/rc.d/rc.local
SSD 和 NVMe
** 如果您的 NVMe 或 SSD 磁盘支持 kyber 调度算法。**
# 临时变更。
echo kyber | sudo tee /sys/block/${disk}/queue/scheduler
# 永久变更。
cat >> /etc/rc.d/rc.local << EOF
echo kyber | sudo tee /sys/block/${disk}/queue/scheduler
EOF
chmod +x /etc/rc.d/rc.local
如果您的系统不支持 SSD 和 NVMe 的 kyber 调度算法,建议您使用 none(或 noop)调度算法。
# 临时变更。
echo none | sudo tee /sys/block/vdb/queue/scheduler
# 永久变更。
cat >> /etc/rc.d/rc.local << EOF
echo none | sudo tee /sys/block/${disk}/queue/scheduler
EOF
chmod +x /etc/rc.d/rc.local
dd
磁盘测速
查看磁盘的读写速度
dd if=/dev/zero of=/dev/null bs=1k count=5000k
dd if=/dev/zero of=/data/tmp/t bs=1k count=5000k
pidstat
查看pid的iops
pidstat -d -p 13050 1
查看所有进程的iops
pidstat -d 3
iotop
查看应用程序的IO情况
yum install -y iotop
iotop
strace
查看对应检查PID的读写延迟
strace -ttT -p 13015
iostat
查看所有磁盘的读写
sudo yum install sysstat
iostat -x 1 10
iostat -dx
filetop
安装
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装bcc-tools
yum install -y bcc-tools
# 配置PATH路径
export PATH=$PATH:/usr/share/bcc/tools
# 验证安装成功
cachestat
跟着我这个执行,如果失败以后在参考下面的例子。
参考链接
查看是否固态
grep ^ /sys/block/*/queue/rotational
0表示是固态,1表示机械。
CPU
CPU Scaling Governor(Cpu超频)
查看是否开启了超频
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
开启超频
echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
CPU Scaling Governor 用于控制 CPU 能耗模式。如果您的 CPU 支持该配置项,建议您将其设置为 performance 以获得更好的 CPU 性能。
pidstat
查看pid对应的cpu使用情况
pidstat -p 13050 1
频率查看
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
top以后按c,就可以看到执行的命令是哪个。
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
执行
siege www.linuxidc.com/test.php -b -r10 -c400
参数说明
- -b 每次request之间没有延迟,还有一个-d参数加上延迟,类似于一些专业测试工具的思考时间。
- -r 每次请求执行多少次。
- -c 并发用户。

评论区