性能调优是一种平衡,系统的默认设置都是折中的方案
性能优化的前提是学会监控,了解系统的瓶颈
性能调优思路
如果不考虑成本
架构优化>硬件升级>代码优化>配置调优
查看系统所有的调优参数
sysctl -a
[root@localhost ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0 #此参数为是否打开ip转发(路由功能)
下面来看一下怎么修改这个参数
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1 #这种方式修改后重启就会还原
net.ipv4.ip_forward = 1
如果需要重启后参数不被还原,则需修改下面的文件
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
将上面的值写入即可
就拿上面的这个项目来说,它的实际位置是
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1
也可这样修改,但是不能使用vi修改
[root@localhost ~]# echo 0 > /proc/sys/net/ipv4/ip_forward
所以只要是在/proc/sys 下就都可以用上面的方法修改
对于 /proc中的数字开头的文件夹,这些文件夹实际对应的是pid ,如要修改它们,则需修
改/etc/rc.d/rc.local文件
无论是 /proc还是 /sys 实际上修改它们都是修改内存中的值,所以会立即生效,但是重启后
会还原,所以需要配合/etc/sysctl.conf 或者 /etc/rc.d/rc.local来实现
find /proc /sys -perm /200 -type f > ~/tunables 这条命令可以导出所有可优化的项目
yum -y install kernel-doc 内核帮助手册
安装后,文件都存放在下面的位置
/usr/share/doc/kernel-doc-3.10.0
如果想查找关于 nr_request的说明 可以使用下面的命令
[root@localhost Documentation]# grep -irn nr_requests .
./block/queue-sysfs.txt:85:nr_requests (RW)
./block/queue-sysfs.txt:97:regulated by nr_requests.
然后到相应的文件去查看具体的说明
下面看一下常用监控工具
yum -y install sysstat-10.1.5-19.el7.x86_64 #安装监视工具
[root@localhost ~]# iostat #不加参数则显示开机到现在为止的平均值
Linux 3.10.0-1062.el7.x86_64 (localhost.local) 05/06/2020 _x86_64_ (2
CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.10 0.00 0.25 0.00 0.00 99.64
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.34 9.43 13.97 179386 265966
scd0 0.00 0.05 0.00 1028 0
iostat -d 1 #一秒刷新一次
iostat -d 1 5 #一秒刷新一次 刷5次
下面用实例来说明
[root@localhost ~]# dd if=/dev/zero of=/dev/null &
当前虚拟机有2个cpu 那么上面的命令每运行一次 系统的负载值就会上升一次,但是不会死机,
那么是因为目前进程的优先级都是平等的,所以cpu会采取轮询的模式,如果使用下面的命令,
则会将优先级又改为实时,运行2次则,电脑直接死机
chrt -f 20 dd if=/dev/zero of=/dev/null &
关于优先级
1-99 为静态优先级需要使用 chrt修改 数字越高 优先级越高
100-139 为动态优先级 使用nice修改 数字越低 优先级越低
其中
avg-cpu: %user %nice %system %iowait %steal %idle
0.32 0.00 0.89 0.02 0.00 98.77
如果%user 很高,则说明和用户的应用程序有关系,比如java应用等
如果%system 很高,则说明和内核有关
如果%nice 很高,则说明和用户自订的nice有关
如果%iowait 很高,则说明和io有关
如果%steal 很高,则说明和虚拟化有关,宿主机上的资源消耗高,这个值就会很高
下面看如何查找高io进程
可以使用iotop命令查看
进一步在通过使用 pmap +进程号 查看进程具体调用了哪些文件,每个文件用了多少内存
pmap 进程号 | awk '{print $2,$4}' | sort -rn | more 查看占用内存高的
iostat中
每秒处理的IO数目 读了多少 写了多少 一共读了多少 一共写了多少
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 64.97 1094.16 1143.66 3585102 3747294
scd0 0.01 0.31 0.00 1028 0
内存总是4的倍数是因为block size是4k
[root@localhost ~]# getconf -a | grep -i page
PAGESIZE 4096
PAGE_SIZE 4096
内存的最小单位就是 "页" 在x86架构中 页的大小就是4k
每个应用程序在申请内存的时候至少会申请一个页
tps表示 每秒处理的IO数
read_kb 每秒处理的KB数
[root@localhost ~]# dd if=/dev/zero of=/data/test1 bs=1M count=1000 oflag=direct
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 3.29693 s, 318 MB/s
上面的命令用于测试直接将数据写到硬盘上而不经过缓存,适用于监测存储性能
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1980 170 1535 9 274 1659
Swap: 3071 0 3071
这里面的cache是用来提升硬盘读写性能的,cache是block的缓存 buffer是innode的缓存
如果想清理缓存可以执行sysctl -w vm.drop_caches=3 ,但是执行后发现并没有变成0,因为有
些正在使用的没法清除,但是生产环境不要使用
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1980 181 1460 9 338 1642
Swap: 3071 0 3071
[root@localhost ~]# sysctl -w vm.drop_caches=3 #=1清buffer 2清cached 3全清
vm.drop_caches = 3
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1980 165 1759 9 55 1708
Swap: 3071 0 3071
那么这里引出一个问题,当内存紧张时是该使用swap还是清cache呢,
此时可以使用下面的命令调整
[root@localhost ~]# sysctl -a | grep swappiness
vm.swappiness = 30
设置为0倾向于使用内存 设置为100时倾向于使用swap
如果处理的都是小IO 则设置小一些
如果处理的都是大IO 则设置大一些
这个只能提升读性能,对写性能没有效果
[root@localhost ~]# valgrind --tool=cache
查看cache命中率
要怎么才能提高写缓存
什么是脏页? 就是在内存中发生了变化,还没有写到硬盘中的数据
如果突然停电了,那么cached中的数据会丢失吗?答案是不会因为有一份已经写入硬盘了
但是有一个
cat /proc/meminfo | grep -i dirty
Dirty: 4KB
如果停电的话,Dirty中的数据会丢失会导致数据丢失
为什么要有脏页呢? 因为可以提升写性能,因为在缓存中经过了IO的整合 ,这个就是所谓的电梯算法
可以使用 cat /proc/meminfo | grep -i dirty 来查看目前的脏页,比如现在复制一个文件,在复制完成后的30秒才会写入硬盘
可以使用 sync 强制刷入硬盘 但是不要轻易使用 会影响性能
sysctl -a | grep dirty
vm.dirty_expire_centisecs = 3000
3000=30s 单位是百分之一秒
所以 随机IO 这个值应该大一些
顺序IO 这个值小一些
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)