Linux服务器性能调优
转自:服务器测试之前置环境OS调优_berlus的博客-CSDN博客
引言
在进行服务器硬件性能测试的过程,不知道大家有没有发现一个问题,就是我明明在同一台机器上进行网卡、storage、Momery性能测试的时候,我仅仅是更换了OS就发现,与之前的性能测试结果偏差很大,那么是什么因素导致的呢?其实用交叉验证的方法很容易判断,OS的因素影响很大,正常情况下调优分为三个层次:硬件本身、BIOS设置、OS本身,这方向尤其在Storage上体现的淋淋尽职,比如IO读写在Windows上跟linux上就有很大的差异,想了解的朋友可以参考这个链接link,那么下面进入今天的正题。
OS调优的方向
以下是博主根据前辈的经验摸索到的知识,同时也查阅了相关材料并且小心印证总结了在以下几个方面的常见调优方法,如有什么不对的地方可以指出来,博主会去修正。
Note:由于本人对文件系统方面涉及不深,所以就不在此篇文章进行说明,感兴趣的朋友可以自行查找相关内容
CPU性能调优的几个方向
CPU: governor(时钟频率方面)
状态如下:
performance (性能):强制 CPU 尽可能使用最高的时钟频率
powersave (省电):强制 CPU 尽可能使用最低的时钟频率
ondemand (按需):系统负载高时,CPU 使用最高的时钟频率;系统空闲时,CPU 使用最低的时钟频率
userspace (用户态):允许用户或用户态程序自行设置时钟频率
conservative (保守):类似 ondemand,区别是它根据是否适合负载来调整时钟频率,而不是简单的在最高和最低之间选择
查询当前CPU支持的频率是什么(每个core都可以查到)
[root@localhost /]# cpupower --cpu all frequency-info --governors
查询当前CPU正在使用的频率模式(每个core都可以查到)
[root@localhost /]# $ cpupower --cpu all frequency-info --policy
将CPU的运行频率打到performance状态
[root@localhost /]# cpupower frequency-set -g performance
CPU: energy_perf_bias(能耗/性能偏差方面)
状态如下:
performance(性能):处理器不为了节省能源而牺牲性能
normal(正常):处理器为了可能明显的节省能源而容许牺牲较小的性能
powersave(省电):处理器为了最有效率的节省能源而接受可能明显的性能减少
[root@localhost /]# x86_energy_perf_policy -r
cpu0: 0x0000000000000006
cpu1: 0x0000000000000006
cpu2: 0x0000000000000006
cpu3: 0x0000000000000006
cpu4: 0x0000000000000006
cpu5: 0x0000000000000006
cpu6: 0x0000000000000006
cpu7: 0x0000000000000006
现在是将其达到performance状态
[root@localhost /]# x86_energy_perf_policy performance
cpu0: 0x0000000000000000
cpu1: 0x0000000000000000
cpu2: 0x0000000000000000
cpu3: 0x0000000000000000
cpu4: 0x0000000000000000
cpu5: 0x0000000000000000
cpu6: 0x0000000000000000
cpu7: 0x0000000000000000
CPU: min_perf_pct(CPU的P-state出发)
状态如下:
max_perf_pct:P-State 的最大值,指可用性能的百分比
num_pstates:硬件支持的 P-State 数
查询 min_perf_pct
[root@localhost /]# cat /sys/devices/system/cpu/intel_pstate
Memory性能调优的几个方向
transparent_ hugepages(透明巨页简称THP )
状态如下:
always:尝试为任意进程分配巨页
madvise:利用 madvise() 系统调用只为个别进程分配巨页
never:禁用透明巨页
查看当前的transparent_huggepage状态
[root@localhost /]# cat /sys/kernel/mm/transparent_hugepage/enabledy
设置当前的transparent_huggepage状态
[root@localhost /]#echo "always" > /sys/kernel/mm/transparent_hugepage/enabled
vm.{dirty_ratio,dirty_background_ratio,swappiness}
vm.dirty_background_ratio: 设置 dirty pages 开始后台回写时的百分比
vm.dirty_ratio: 设置 dirty pages 开始回写时的百分比
vm.swappiness: 控制从物理内存换出到交换空间的相对权重,取值为 0 到 100。更低的值导致避免交换,而更高的值导致尝试使用交换空间
Storage性能调优的几个方向
Readahead(读取文件列表的内容到内存,以便当实际需要时可从缓存读取)
查看缓存读取大小
[root@localhost /]#/sys/block/sda/queue/read_ahead_kb
Scheduler(I/O调度器)
模式如下:
cfq:Completely Fair Queueing(完全公平队列)调度器,它将进程分为实时、尽其所能和空闲三个独立的类别。实时类别的进程先于尽其所能类别的进程执行,而尽其所能类别的进程总是在空闲类别的进程之前执行。默认情况下分配到尽其所能类别的进程
deadline:尝试为 I/O 请求提供有保障的延迟。适用于大多数情况,尤其是读取操作比写入操作更频繁的请求 ---->mq-deadline
noop:执行简单的 FIFO(先进先出)调度算法,并实现请求合并。适合使用快速存储的 CPU 计算密集型系统----->none
blk-mq:即 Multi-Queue Block IO Queuing Mechanism(多队列块 IO 队列机制),它利用具有多核的 CPU 来映射 I/O 队列到多队列。与传统的 I/O 调度器相比,通过多线程及多个 CPU 核心来分发任务,从而能够加速读写操作。该调度器适合高性能的闪存设备如PCIe SSD
查看当前的scheduler是什么,kernel支持哪几种
#debian 9.x 支持none/kyler/mq-deadline默认的是none调度器,centos7一般支持deadline/cfg/noop 默认是cfq)
[root@localhost /]# cat /sys/block/sda/quene/scheduler
临时修改当前的的i/o scheduler为deadline
[root@localhost /]#echo "deadline" > /sys/block/sda/queue/scheduler
其中在grub.cfg中追加 elevator=deadline 内核参数,调度模式将永久生效成deadline
kernel.sched_{min_granularity_ns,wakeup_granularity_ns,migration_cost_ns}
kernel.sched_min_granularity_ns: 针对 CPU 计算密集型任务设置调度器的最小抢占粒度
kernel.sched_wakeup_granularity_ns: 设置调度器的唤醒粒度,这将延迟抢占效应,并减少过度调度
kernel.sched_migration_cost_ns: 调度器认为迁移的进程“cache hot”因而更少可能被重新迁移的总时间
网络性能调优的几个方向
net.pv4.{tcp_rmem,tcp_wmem,udp_mem}
tcp_rmem:用于 autotuning 函数,设置 TCP 接收缓冲的最小、默认及最大字节数
tcp_wmen:用于 autotuning 函数,设置 TCP 发送缓冲的最小、默认及最大字节数
udp_mem:设置 UDP 队列的页数
网络: net.core.busy_{read,poll}
net.core.busy_read: 针对 socket 读取设置低延迟 busy poll 超时
net.core.busy_poll: 针对 poll 和 select 设置低延迟 busy poll 超时
net.ipv4.tcp_fastopen: TCP 快速打开(TFO)
对于整体OS系统调优来说需要进行如下参数调整
1.governor=performance (CPU的频率打到performance)
2.energy_perf_bias=performance(功耗上打到performance)
min_perf_pct=100(P-state上面)
transparent_hugepages=always *(打开THP)
readahead=>4096(缓存数据写到最大)
scheduler=deadline *(I/O调度器调整为deadline)
throughput-performance
文件位置/proc/sys/kernel
sched_min_granularity_ns = 10000000
sched_wakeup_granularity_ns = 15000000
文件位置/proc/sys/vm
dirty_ratio = 40
dirty_background_ratio = 10
swappiness = 10
latency-performance
sched_min_granularity_ns = 10000000
sched_migration_cost_ns = 5000000
dirty_ratio = 10
dirty_background_ratio = 3
swappiness = 10
network-throughput
sched_min_granularity_ns = 10000000
sched_wakeup_granularity_ns = 15000000
dirty_ratio = 40
dirty_background_ratio = 10
swappiness = 10
文件位置/proc/sys/net/ipv4/
net.ipv4.tcp_rmem = 4096 87380 16777216 ##依据硬件配置的实际情况
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.udp_mem = 3145728 4194304 16777216
network-latency
transparent_hugepages=never
kernel.sched_min_granularity_ns = 10000000
kernel.sched_migration_cost_ns = 5000000
dirty_ratio = 10
dirty_background_ratio = 3
swappiness = 10
net.core.busy_read = 50
net.core.busy_poll = 50
net.ipv4.tcp_fastopen = 3
virtual-host
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
kernel.sched_migration_cost_ns = 5000000
vm.dirty_ratio = 40
vm.dirty_background_ratio = 5
vm.swappiness = 10
virtual-guest
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
vm.dirty_ratio = 30
vm.dirty_background_ratio = 10
vm.swappiness = 30
总结
scheduler: 相比 cfq 的表现,deadline 无论在读还是在写上都更有优势。对于具有固态存储设备的场景而言,blk-mq 值得一试
kernel.sched_min_granularity_ns: 比默认值调得更大一些,推荐设为 10000000(1 毫秒),从而稍微延迟抢占,具有更好的性能表现。该参数值适合上述所有场景
kernel.sched_wakeup_granularity_ns: 比默认值调大,从而避免过度调度,推荐设为 15000000(1.5 毫秒)。仅在注重吞吐量的情况下设置该参数,低延迟的情况不要设置
kernel.sched_migration_cost_ns: 比默认值调大,从而减少任务的重新迁移,推荐设为 5000000(0.5 毫秒)。仅在注重低延迟的情况下设置该参数,高吞吐量的情况不要设置
vm.dirty_ratio: 高吞吐量的情况一般设置为 40,低延迟的情况通常设置为 10
vm.dirty_background_ratio: 高吞吐量的情况可设为 10,低延迟的情况可设为 3
vm.swappiness: 一般设为 10,从而避免过多 swap 交换。仅在作为虚拟客户机的情况下可设高一些(30)
仅在注重网络吞吐量的情况下调节
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
net.ipv4.udp_mem
仅在注重网络低延迟的情况下调节
net.core.busy_read
net.core.busy_poll
net.ipv4.tcp_fastopen
--------------------
# 增加系统的网络缓冲区大小
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216