随笔 - 72,  文章 - 0,  评论 - 1,  阅读 - 22557

性能调优是一种平衡,系统的默认设置都是折中的方案

性能优化的前提是学会监控,了解系统的瓶颈

性能调优思路


如果不考虑成本

架构优化>硬件升级>代码优化>配置调优

 

查看系统所有的调优参数
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 这个值小一些

posted on   wilson'blog  阅读(205)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示