TUNED-ADM 性能調優分析

主題大綱


  1. tuned-adm 簡介03node

  2. 性能調優方向04linux

  3. 性能調優場景09git

  4. 性能調優分析15github

  5. 總結49web




tuned-adm 簡介

RHEL 自帶的性能調優工具,經過針對特定應用場景提供配置 (profile) 來改善系統性能算法

tuned-adm 官方主頁緩存




性能調優方向

  • CPU: governor、energy_perf_bias、min_perf_pct網絡




性能調優方向

  • CPU: governor、energy_perf_bias、min_perf_pct多線程

  • 內存: transparent_hugepages、vm.{dirty_ratio,dirty_background_ratio,swappiness}



性能調優方向

  • CPU: governor、energy_perf_bias、min_perf_pct

  • 內存: transparent_hugepages、vm.{dirty_ratio,dirty_background_ratio,swappiness}

  • 磁盤: readahead、scheduler、kernel.sched_{min_granularity_ns,wakeup_granularity_ns,migration_cost_ns}



性能調優方向

  • CPU: governor、energy_perf_bias、min_perf_pct

  • 內存: transparent_hugepages、vm.{dirty_ratio,dirty_background_ratio,swappiness}

  • 磁盤: readahead、scheduler、kernel.sched_{min_granularity_ns,wakeup_granularity_ns,migration_cost_ns}

  • 文件系統 (EXT4): relatime/noatime、barrier/nobarrier、discard/nodiscard




性能調優方向

  • CPU: governor、energy_perf_bias、min_perf_pct

  • 內存: transparent_hugepages、vm.{dirty_ratio,dirty_background_ratio,swappiness}

  • 磁盤: readahead、scheduler、kernel.sched_{min_granularity_ns,wakeup_granularity_ns,migration_cost_ns}

  • 文件系統 (EXT4): relatime/noatime、barrier/nobarrier、discard/nodiscard

  • 網絡: net.ipv4.{tcp_rmem,tcp_wmem,udp_mem}、net.core.busy_{read,poll}、net.ipv4.tcp_fastopen



性能調優場景

  1. throughput-performance (側重於吞吐量)



性能調優場景

  1. throughput-performance (側重於吞吐量)

  2. latency-performance (側重於低延遲)



性能調優場景

  1. throughput-performance (側重於吞吐量)

  2. latency-performance (側重於低延遲)

  3. network-throughput (側重於網絡吞吐量)




性能調優場景

  1. throughput-performance (側重於吞吐量)

  2. latency-performance (側重於低延遲)

  3. network-throughput (側重於網絡吞吐量)

  4. network-latency (側重於更低的網絡延遲)




13 / 53

性能調優場景

  1. throughput-performance (側重於吞吐量)

  2. latency-performance (側重於低延遲)

  3. network-throughput (側重於網絡吞吐量)

  4. network-latency (側重於更低的網絡延遲)

  5. virtual-host (側重於優化虛擬主機)




14 / 53

性能調優場景

  1. throughput-performance (側重於吞吐量)

  2. latency-performance (側重於低延遲)

  3. network-throughput (側重於網絡吞吐量)

  4. network-latency (側重於更低的網絡延遲)

  5. virtual-host (側重於優化虛擬主機)

  6. virtual-guest (側重於優化虛擬客戶機)



CPU: governor

CPU 時鐘頻率的管理模式

  • performance (性能):強制 CPU 儘量使用最高的時鐘頻率



CPU: governor

CPU 時鐘頻率的管理模式

  • performance (性能):強制 CPU 儘量使用最高的時鐘頻率

  • powersave (省電):強制 CPU 儘量使用最低的時鐘頻率



17 / 53

CPU: governor

CPU 時鐘頻率的管理模式

  • performance (性能):強制 CPU 儘量使用最高的時鐘頻率

  • powersave (省電):強制 CPU 儘量使用最低的時鐘頻率

  • ondemand (按需):系統負載高時,CPU 使用最高的時鐘頻率;系統空閒時,CPU 使用最低的時鐘頻率



18 / 53

CPU: governor

CPU 時鐘頻率的管理模式

  • performance (性能):強制 CPU 儘量使用最高的時鐘頻率

  • powersave (省電):強制 CPU 儘量使用最低的時鐘頻率

  • ondemand (按需):系統負載高時,CPU 使用最高的時鐘頻率;系統空閒時,CPU 使用最低的時鐘頻率

  • userspace (用戶態):容許用戶或用戶態程序自行設置時鐘頻率



19 / 53

CPU: governor

CPU 時鐘頻率的管理模式

  • performance (性能):強制 CPU 儘量使用最高的時鐘頻率

  • powersave (省電):強制 CPU 儘量使用最低的時鐘頻率

  • ondemand (按需):系統負載高時,CPU 使用最高的時鐘頻率;系統空閒時,CPU 使用最低的時鐘頻率

  • userspace (用戶態):容許用戶或用戶態程序自行設置時鐘頻率

  • conservative (保守):相似 ondemand,區別是它根據是否適合負載來調整時鐘頻率,而不是簡單的在最高和最低之間選擇





20 / 53

查詢 governor (目前支持)

$ cpupower --cpu all frequency-info --governors
analyzing CPU 0:
available cpufreq governors: performance powersave

analyzing CPU 1:
available cpufreq governors: performance powersave

analyzing CPU 2:
available cpufreq governors: performance powersave

analyzing CPU 3:
available cpufreq governors: performance powersave


21 / 53

查詢 governor (正在使用)

$ cpupower --cpu all frequency-info --policy
analyzing CPU 0:
current policy: frequency should be within 400 MHz and 3.20 GHz.
The governor "powersave" may decide which speed to use
within this range.

analyzing CPU 1:
current policy: frequency should be within 400 MHz and 3.20 GHz.
The governor "powersave" may decide which speed to use
within this range.

analyzing CPU 2:
current policy: frequency should be within 400 MHz and 3.20 GHz.
The governor "powersave" may decide which speed to use
within this range.

analyzing CPU 3:
current policy: frequency should be within 400 MHz and 3.20 GHz.
The governor "powersave" may decide which speed to use
within this range.





22 / 53

設置 governor

方法一:

$ sudo cpupower frequency-set --governor performance

方法二:

/sys/devices/system/cpu/cpu*/cpufreq/scaling_available_governors
/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor




CPU: energy_perf_bias

Energy Performance Bias(能耗/性能誤差)

  • performance(性能):處理器不爲了節省能源而犧牲性能




CPU: energy_perf_bias

Energy Performance Bias(能耗/性能誤差)

  • performance(性能):處理器不爲了節省能源而犧牲性能

  • normal(正常):處理器爲了可能明顯的節省能源而允許犧牲較小的性能





CPU: energy_perf_bias

Energy Performance Bias(能耗/性能誤差)

  • performance(性能):處理器不爲了節省能源而犧牲性能

  • normal(正常):處理器爲了可能明顯的節省能源而允許犧牲較小的性能

  • powersave(省電):處理器爲了最有效率的節省能源而接受可能明顯的性能減小





26 / 53

查詢 energy_perf_bias

$ sudo x86_energy_perf_policy -r
cpu0: 0x0000000000000006            # 表明 normal
cpu1: 0x0000000000000006
cpu2: 0x0000000000000006
cpu3: 0x0000000000000006

NOTE:
{kernel-source}/tools/power/x86/x86_energy_perf_policy



設置 energy_perf_bias

$ sudo x86_energy_perf_policy performance
cpu0  msr0x1b0 0x0000000000000006 -> 0x0000000000000000
cpu1  msr0x1b0 0x0000000000000006 -> 0x0000000000000000
cpu2  msr0x1b0 0x0000000000000006 -> 0x0000000000000000
cpu3  msr0x1b0 0x0000000000000006 -> 0x0000000000000000



CPU: min_perf_pct

Intel 處理器 P-State(Performance States,性能狀態) 的最小值,指最大化性能級別的百分比

  • max_perf_pct:P-State 的最大值,指可用性能的百分比

  • num_pstates:硬件支持的 P-State 數



查詢 min_perf_pct

/sys/devices/system/cpu/intel_pstate




內存: transparent_hugepages

Transparent Huge Pages (透明巨頁),內核自動分配巨頁給進程

  • always:嘗試爲任意進程分配巨頁



內存: transparent_hugepages

Transparent Huge Pages (透明巨頁),內核自動分配巨頁給進程

  • always:嘗試爲任意進程分配巨頁

  • madvise:利用 madvise() 系統調用只爲個別進程分配巨頁




內存: transparent_hugepages

Transparent Huge Pages (透明巨頁),內核自動分配巨頁給進程

  • always:嘗試爲任意進程分配巨頁

  • madvise:利用 madvise() 系統調用只爲個別進程分配巨頁

  • never:禁用透明巨頁



查詢/設置 transparent_hugepages

cat /sys/kernel/mm/transparent_hugepage/enabled             # 查看
echo "always" > /sys/kernel/mm/transparent_hugepage/enabled # 設置





內存: vm.*


  • vm.dirty_background_ratio: 設置 dirty pages 開始後臺回寫時的百分比

  • vm.dirty_ratio: 設置 dirty pages 開始回寫時的百分比

  • vm.swappiness: 控制從物理內存換出到交換空間的相對權重,取值爲 0 到 100。更低的值致使避免交換,而更高的值致使嘗試使用交換空間




磁盤: readahead

讀取文件列表的內容到內存,以便當實際須要時可從緩存讀取

/sys/block/sda/queue/read_ahead_kb

NOTE: 替換塊設備 sda




36 / 53

磁盤: scheduler

I/O 調度器

  • cfq:Completely Fair Queueing(徹底公平隊列)調度器,它將進程分爲實時、盡其所能和空閒三個獨立的類別。實時類別的進程先於盡其所能類別的進程執行,而盡其所能類別的進程老是在空閒類別的進程以前執行。默認狀況下分配到盡其所能類別的進程

  • deadline:嘗試爲 I/O 請求提供有保障的延遲。適用於大多數狀況,尤爲是讀取操做比寫入操做更頻繁的請求

  • noop:執行簡單的 FIFO(先進先出)調度算法,並實現請求合併。適合使用快速存儲的 CPU 計算密集型系統

  • blk-mq:即 Multi-Queue Block IO Queuing Mechanism(多隊列塊 IO 隊列機制),它利用具備多核的 CPU 來映射 I/O 隊列到多隊列。與傳統的 I/O 調度器相比,經過多線程及多個 CPU 核心來分發任務,從而可以加速讀寫操做。該調度器適合高性能的閃存設備(如 PCIe SSD)




37 / 53

查看/設置 scheduler

cat /sys/block/sda/queue/scheduler                # 查看當前使用的 I/O 調度器
echo "deadline" > /sys/block/sda/queue/scheduler  # 臨時將 I/O 調度器設爲 deadline
追加 elevator=deadline 內核參數                     # 永久設置

scsi_mod.use_blk_mq=y dm_mod.use_blk_mq=y         # 注意啓用 blk-mq 後,將禁用全部別的 I/O 調度器

NOTE: 替換塊設備 sda




kernel.sched_*

  • kernel.sched_min_granularity_ns: 針對 CPU 計算密集型任務設置調度器的最小搶佔粒度

  • kernel.sched_wakeup_granularity_ns: 設置調度器的喚醒粒度,這將延遲搶佔效應,並減小過分調度

  • kernel.sched_migration_cost_ns: 調度器認爲遷移的進程「cache hot」於是更少可能被從新遷移的總時間



文件系統 (ext4)

掛載參數

  • relatime/noatime: 對於如何更新 inode 訪問時間的策略

  • barrier=<0|1>(barrier/nobarrier): 該選項開啓或禁用在 jbd 代碼中使用寫入 barrier

  • discard/nodiscard: 控制是否執行 discard/TRIM 命令,對 SSD 設備有用




40 / 53

網絡: net.ipv4.{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)




42 / 53

common


governor=performance
energy_perf_bias=performance
min_perf_pct=100
transparent_hugepages=always *
readahead=>4096
scheduler=deadline *

* 視狀況而定




throughput-performance


kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.swappiness = 10




latency-performance


kernel.sched_min_granularity_ns = 10000000
kernel.sched_migration_cost_ns = 5000000
vm.dirty_ratio = 10
vm.dirty_background_ratio = 3
vm.swappiness = 10




45 / 53

network-throughput

在 throughput-performance 基礎上增長網絡調優

kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.swappiness = 10
net.ipv4.tcp_rmem = 4096        87380   16777216
net.ipv4.tcp_wmem = 4096        16384   16777216
net.ipv4.udp_mem = 3145728      4194304 16777216



46 / 53

network-latency

在 latency-performance 基礎上增長網絡調優

transparent_hugepages=never
kernel.sched_min_granularity_ns = 10000000
kernel.sched_migration_cost_ns = 5000000
vm.dirty_ratio = 10
vm.dirty_background_ratio = 3
vm.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



49 / 53

50 / 53

總結 (續)


  • vm.dirty_ratio: 高吞吐量的狀況通常設置爲 40,低延遲的狀況一般設置爲 10

  • vm.dirty_background_ratio: 高吞吐量的狀況可設爲 10,低延遲的狀況可設爲 3

  • vm.swappiness: 通常設爲 10,從而避免過多 swap 交換。僅在做爲虛擬客戶機的狀況下可設高一些(30)


51 / 53

總結 (續)

毫無疑問 noatime 應該做爲默認掛載參數,nobarrier 在寫上的性能優點十分明顯,discard 適合 SSD 的場合

noatime
nobarrier
discard


52 / 53

總結 (續)

僅在注重網絡吞吐量的狀況下調節

net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
net.ipv4.udp_mem

僅在注重網絡低延遲的狀況下調節

net.core.busy_read
net.core.busy_poll
net.ipv4.tcp_fastopen



相關文章
相關標籤/搜索