溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux 操作系統(tǒng)調(diào)優(yōu)

發(fā)布時間:2020-07-06 04:15:50 來源:網(wǎng)絡 閱讀:1549 作者:長跑者1號 欄目:系統(tǒng)運維

一 CPU 調(diào)優(yōu)

1 系統(tǒng)拓撲

1 概述

在現(xiàn)代計算機技術中,大部分的系統(tǒng)都是擁有多個處理器的,多個處理器之間的連接并連接其他資源則需要通過系統(tǒng)拓撲來調(diào)節(jié)以產(chǎn)生影響

2 現(xiàn)代計算機技術的兩種拓撲類型

1 SMP(對稱多處理器)

SMP(對稱多處理器)拓撲允許所有的處理器同時訪問內(nèi)存,然而,由于內(nèi)存訪問權(quán)限的共享性和平等性,固然會迫使所有的CPU和SMP系統(tǒng)序列化的內(nèi)存訪問權(quán)限局限性能加,目前這種情況是不被接受的,因此,現(xiàn)在服務器系統(tǒng)都是NUMA(非一致性內(nèi)存訪問)機制。

2 NUMA 拓撲(非一致性內(nèi)存訪問機制)

比起 SMP 拓撲,NUMA(非一致性內(nèi)存訪問)拓撲是近來才開發(fā)的,在NUMA系統(tǒng)中,多個處理器物理分組至一個socket,每個socket都由一個專用內(nèi)存區(qū),對該內(nèi)存進行本地訪問的服務器系統(tǒng)稱為一個節(jié)點。


同一個節(jié)點上的服務器能夠高速訪問該節(jié)點的存儲體,但訪問其他節(jié)點的存儲體速度就比較慢,因此,訪問非本地存儲體會造成性能的損失。

3 NUMA 拓撲調(diào)節(jié)注意事項

考慮到性能損失,服務器執(zhí)行應用程序時,NUMA 拓撲結(jié)構(gòu)系統(tǒng)中對性能敏感的應用程序應訪問同一節(jié)點的內(nèi)存,并且應盡可能地避免訪問任何遠程內(nèi)存。


因此,在調(diào)節(jié) NUMA 拓撲結(jié)構(gòu)系統(tǒng)中的應用程序性能時,重要的是要考慮這一應用程序的執(zhí)行點以及最靠近此執(zhí)行點的存儲體。


在 NUMA 拓撲結(jié)構(gòu)系統(tǒng)中,/sys 文件系統(tǒng)包含處理器、內(nèi)存及外圍設備的連接信息。
/sys/devices/system/cpu 目錄包含處理器在系統(tǒng)中相互連接的詳情。 /sys/devices/system/node 目錄包含系統(tǒng)中 NUMA 的節(jié)點信息以及節(jié)點間的相對距離。

4 確定系統(tǒng)拓撲結(jié)構(gòu)

1 使用 numactl --hardware 指令描述系統(tǒng)的拓撲結(jié)構(gòu)

[root@python ~]# numactl   --hardware
available: 1 nodes (0)  # 內(nèi)存只有一個
node 0 cpus: 0 1 2 3
node 0 size: 4095 MB
node 0 free: 177 MB
node distances:
node   0
  0:  10

2 使用 lscpu 指令來查詢
其指令由util-linux 數(shù)據(jù)包提供,包括CPU體系結(jié)構(gòu)信息,如CPU數(shù)量,線程數(shù),內(nèi)核數(shù),socket數(shù)量以及NUMA節(jié)點數(shù)等。

[root@python ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    2
座:                 2
NUMA 節(jié)點:         1
廠商 ID:           GenuineIntel
CPU 系列:          6
型號:              158
型號名稱:        Intel(R) Core(TM) i5-7500 CPU @ 3.40GHz
步進:              9
CPU MHz:             3408.003
BogoMIPS:            6816.00
虛擬化:           VT-x
超管理器廠商:  VMware
虛擬化類型:     完全
L1d 緩存:          32K
L1i 緩存:          32K
L2 緩存:           256K
L3 緩存:           6144K
NUMA 節(jié)點0 CPU:    0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ibrs ibpb stibp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp arch_capabilities

2 調(diào)度

系統(tǒng)調(diào)度器決定運行線程的處理器和運行的時間。但由于調(diào)度器主要關注的是保持系統(tǒng)繁忙,因此可能不會為應用程序的性能而對線程進行最佳調(diào)度。


例,在NUMA系統(tǒng)中,一個處理器在節(jié)點B可用,一個應用程序在節(jié)點A運行,要使在節(jié)點B的處理器保持忙碌,調(diào)度器會把應用程序的一個線程轉(zhuǎn)移到節(jié)點B。但是,線程上的應用程序仍然需要訪問在節(jié)點A的內(nèi)存。由于該線程目前在節(jié)點B運行,并且對于此線程來說節(jié)點A的內(nèi)存已不再是本地內(nèi)存,訪問起來就要花更長的時間。較于在節(jié)點A等待可用的處理器,并且在能夠進行本地內(nèi)存訪問的源節(jié)點上執(zhí)行線程,此線程在節(jié)點B結(jié)束運行可能就更加費時。

1 內(nèi)核滴答信號

滴答信號: 早起Linux 版本中,Linux內(nèi)核會定期終端每個CPU已查看需要完成的任務,查看的結(jié)果用來決定進程調(diào)度及負載均衡,這便是滴答信號


缺點:此標記不會考慮內(nèi)核是否有任務要執(zhí)行,這使得即使空閑的內(nèi)核也會被迫定期進入高能狀態(tài),這阻止了系統(tǒng)有效的利用x86代處理器的深睡眠狀態(tài)


按需中斷:

默認的redhat 6和7內(nèi)核不再中斷趨于低功率狀態(tài)的空閑CPU, 當一個或幾個任務在運行時,按需中斷取代了定時中斷,使得CPU可以更長久的處于空閑狀態(tài)或低功率狀態(tài)用以減少電量的消耗。


動態(tài)無時鐘設置:

Linux redhat 7 提供一種動態(tài)的無時鐘設置(nohz_full),通過用戶空間的任務來減少內(nèi)核干擾以進一步改善其確定性。這一設置可以在指定的內(nèi)核中通過 nohz_full 內(nèi)核參數(shù)來啟用。當這一設置在一個內(nèi)核中啟用時,所有的計時活動將會被移動至無延遲敏感性的內(nèi)核。這對于高性能計算和實時計算工作負載來說都很有用,因為其用戶空間任務對由于內(nèi)核計時器滴答信號造成的微秒級的延遲尤為敏感。

2 中斷請求管理(Interrupt ReQuest)

中斷請求或 IRQ 是請求及時關注的信號,是從硬件發(fā)送至處理器的。系統(tǒng)中的每個設備都分配到一個或多個 IRQ 號,以便能發(fā)送獨一的中斷信號。當啟用中斷時,收到中斷請求的處理器會立即暫停執(zhí)行當前應用程序線程,這是為了處理該中斷請求。 因為中斷了正常的運行,高中斷率會嚴重降低系統(tǒng)性能,但減少中斷事件是可能的,可以設置中斷關聯(lián)或發(fā)送一批低優(yōu)先率的中斷(“組合中斷”)來處理此種情況。

3 監(jiān)控和診斷性能問題

1 turbostat

Turbostat 在規(guī)定的間隔中給出計時器的結(jié)果以協(xié)助管理員識別服務器異常,例如過度耗電,無法進入深睡 眠狀態(tài)或是創(chuàng)建了不必要的系統(tǒng)管理中斷(SMIs)。


turbostat 工具是 內(nèi)核工具 數(shù)據(jù)包的一部分。支持在 AMD 64 和 Intel? 64 處理器的系統(tǒng)中使用。需要 root 特權(quán)來運行,處理器支持時間戳計時器以及 APERF 和 MPERF 型號的特定寄存器。

2 numastat

numastat 工具會列舉每個 NUMA 節(jié)點內(nèi)存數(shù)據(jù)給所有的進程和操作系統(tǒng),并會告知管理員進程內(nèi)存是散布于系統(tǒng)還是集中于某個節(jié)點。


通過處理器的 top 輸出進行交互參照 numastat 輸出,以確認進程線程是在同一個節(jié)點運行,此節(jié)點是進程內(nèi)存分配節(jié)點。

[root@centos8 ~]# numastat
                           node0
numa_hit                 4372424
numa_miss                      0
numa_foreign                   0
interleave_hit             19604
local_node               4372424
other_node                     0

numa_hit 為這個節(jié)點成功的分配嘗試次數(shù)

numa_miss 由于在目的節(jié)點中內(nèi)存較低而嘗試為這個節(jié)點分配到另一個節(jié)點的數(shù)目,每個numa_miss事件都在另一個節(jié)點中有對應的numa_foregin 事件。

numa_foreign 最初要為這個節(jié)點但最后分配另一個節(jié)點的分配數(shù),每個numa_foregin 事件都在另一個節(jié)點中有對應的numa_miss 事件

3 /proc/中斷

/proc/interrupts 文件列舉了從一個特殊的 I/O 設備發(fā)送至各處理器的中斷數(shù)量,顯示了中斷請求 (IRQ)數(shù)量、系統(tǒng)中各處理器處理該類型中斷請求的數(shù)量,發(fā)送的中斷類型以及以逗號分隔開的回應所列中斷請求的設備列表。


如果一個特定的應用程序或是設備生成大量的中斷請求給遠程處理器處理,其性能就會受到影響。這種情況 下,當應用程序或設備在處理中斷請求時,可以在同一節(jié)點設置一個處理器,以此來緩解性能不佳的狀況。將 中斷處理分配給特定處理器的方法.

4 配置建議

默認情況下,Redhat 7 使用無時鐘內(nèi)核,其不會中斷空閑CPU來減少用電量,并允許較新的處理器利用深睡眠狀態(tài)。

紅帽企業(yè)版 Linux 7 同樣提供一種動態(tài)的無時鐘設置(默認禁用),這對于延遲敏感型的工作負載來說是很有幫助的,例如高性能計算或?qū)崟r計算。

5 配置內(nèi)核滴答信號時間

要啟用特定內(nèi)核中的動態(tài)無時鐘性能,在內(nèi)核命令行中用 nohz_full 參數(shù)進行設定。在16 核的系統(tǒng)中,設定 nohz_full=1-15 可以在 1 到 15 內(nèi)核中啟用動態(tài)無時鐘內(nèi)核性能,并將所有的計時移動至唯一未設定的內(nèi)核中(0 內(nèi)核)。這種性能可以在啟動時暫時啟用,也可以在 /etc/default/grub 文件中永久啟用。 要持續(xù)此性能,請運行 grub2-mkconfig -o /boot/grub2/grub.cfg 指令來保存配置。


啟動動態(tài)無時鐘性能需要一些手一動管理

當系統(tǒng)啟動時,必須手動將rcu線程移動到對延遲不敏感的內(nèi)核,這種情況下為0內(nèi)核。

for i in `pgrep rcu` ; do taskset -pc 0 $i ; done

在內(nèi)核命令行上使用 isolcpus 參數(shù)來將特定的內(nèi)核與用戶空間任務隔離開。 可以選擇性地為輔助性內(nèi)核設置內(nèi)核回寫式 bdi-flush 線程的 CPU 關聯(lián):

echo 1 > /sys/bus/workqueue/devices/writeback/cpumask 

驗證動態(tài)無時鐘配置是否正常運行,執(zhí)行以下命令,其中 stress 是在 CPU 中運行 1 秒的程序。

 perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1

默認的內(nèi)核計時器配置在繁忙 CPU 中顯示1000 次滴答記號:

 # perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1 1000 irq_vectors:local_timer_entry 

動態(tài)無時鐘內(nèi)核配置下,用戶只會看到一次滴答記號:

 # perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1 

 1 irq_vectors:local_timer_entry

6 設置硬件性能策略

x86_energy_perf_policy 工具允許管理員定義性能與能效的相對重要性。當處理器在性能與能效間權(quán)衡選 擇時,此信息可用來改變支持這一特征的處理器。

默認情況下適用于所有在 performance 模式下的處理器,它要求處理器的支持,由 CPUID.06H.ECX.bit3 顯示,且必須在有 root 特權(quán)的情況下運行。 x86_energy_perf_policy 由 kernel-tools 數(shù)據(jù)包提供。如何使用 x86_energy_perf_policy

7 使用taskset 設置處理器關聯(lián)

taskset 工具由 util-linux 數(shù)據(jù)包提供。Taskset 允許管理員恢復和設置進程中的處理器關聯(lián),或通過特定的 處理器關聯(lián)來啟動一個進程。


1 使用 taskset 設置CPU的親和性

taskset搜索并設定運行進程的CPU親和性(根據(jù)進程ID),他還可以用于啟動給CPU親和性的進程,這個就可以將指定的進程與指定的CPU或者一組CPU進行捆綁,但taskset不保證本地內(nèi)存分配。

如果想需要本地內(nèi)存分配給額外性能利益,則建議使用numacl


CPU的親原形使用位掩碼表示,最低位對應第一個邏輯CPU,且最高位對應最后一個邏輯CPU,這些掩碼通常是十六進制,因此 0x00000001 代表處理器0 表示為0001 0x00000009 代表處理器3 和 1 表示為1001


設置CPU和進程的親和性

要想設定運行進程的CPU親和性,執(zhí)行 taskset -p mask pid 進行處理
要啟動給定親和性的進程,執(zhí)行

taskset  mask  --program   

-c 指定綁定在哪個cpu上

taskset  -c  0,1,2,3   --myprogram 

查看進程運行在哪個CPU上

ps axo   pid,psr 

PSR 運行在哪個處理器上

ps  axo  pid,psr  | grep  pid  

linux 操作系統(tǒng)調(diào)優(yōu)

上述綁定方式只能實現(xiàn)一個進程運行在這個CPU上,但不能保證別的進程不運行在對應的CPU上,如果需要,必須在操作系統(tǒng)日志啟動之前執(zhí)行某些進程目前不能使用,隔離出來.

[root@master ~]# cat /etc/rc.local 
taskset  -c 1,2    httpd

[root@master ~]# ps  axo  pid,psr  | grep  -E  "1296|1298"
  1296   2
  1298   2

此方式能保證進程運行在該CPU,但不能保證CPU中的內(nèi)存數(shù)據(jù)運行在本地中

8 使用numactl 管理 NUMA 關聯(lián)

管理員可以通過特定的調(diào)度或者內(nèi)存安裝策略來使用Numactl 運行進程,numactl也可以為共享內(nèi)存片段或文件設置永久性策略,并設置處理器關聯(lián)和進程的內(nèi)存關聯(lián)

在NUMA系統(tǒng)系統(tǒng)中,處理器和內(nèi)存條之間的距離越大,其訪問內(nèi)存條的速度就越慢,應該講對性能敏感的程序配置為可以從最近的內(nèi)存條分配內(nèi)存,最好是使用在同一 NUMA 節(jié)點的內(nèi)存和 CPU


注意事項

對性能敏感的多線程應用程序經(jīng)配置后在特定的 NUMA 節(jié)點上運行會比在特定的處理器上運行好處更多。這是否適合則取決于用戶系統(tǒng)及應用程序的需求。如果多個應用程序線程訪問同一緩存數(shù)據(jù),那么對那些線程進行配置,使其在同一處理器上運行可能是合適的。但是,如果在同一處理器上運行的多線程訪問及緩存的是不同數(shù)據(jù),那么每個線程可能會收回之前線程訪問的緩存數(shù)據(jù)。這就意味著每個線程會“缺失”緩存,會浪費運行 時間來從磁盤中獲取數(shù)據(jù)并在緩存中替代它。


/sys 文件系統(tǒng)包含有CPU,內(nèi)存和外設,其連接是通過.NUMA進行互聯(lián)的,特別是/sys/devices/system/cpu 目錄中包含有關系統(tǒng)的CPU是圖和處理連接信息的,

/sys/devices/system/node 目錄包含有關系統(tǒng)中NUMA 節(jié)點以及節(jié)點間的相對距離的信息

/proc 內(nèi)核級別的信息

/sys 硬件,內(nèi)存相關的信息


numactl參數(shù)詳解

--show
顯示當前進程的NUMA策略設置


--hardware
顯示系統(tǒng)中可用節(jié)點的清單


--membind 內(nèi)存親原性
只從指定節(jié)點分配內(nèi)存,當使用這個參數(shù)時,如果這些節(jié)點中的內(nèi)存不足則分配會失敗,這個參數(shù)的用法是


Numactl --membind=nodes program ,其中nodes 是您要從中分配內(nèi)存的節(jié)點列表,program 是要從哪個節(jié)點分配內(nèi)存的程序,節(jié)點號可以采用逗號分開的列表,范圍或者兩者的結(jié)合方式提供,


--cpunodebind 綁定CPU和內(nèi)存
只執(zhí)行屬于指定節(jié)點的CPU中的命令(及其子進程),這個參數(shù)的用法是numactl --cpunodebind=nodes progrpm ,其中nodes 是指定程序要捆綁的CPU 所屬節(jié)點列表,節(jié)點號可以采用逗號分開的列表,范圍或者兩者的結(jié)合方式提供


--physcpubind
只執(zhí)行指定CPU 中的命令,這個參數(shù)的用法是numactl --physcpubind=cpu program,其中CPU 是用逗號分隔開的物理CPU 號列表,這些數(shù)據(jù)在/proc/cpuinfo 的processor字段中顯示,program是只在那些CPU中執(zhí)行的程序,還要將CPU指定為與當前cpuset 相關聯(lián)


--localalloc
指定永遠要在當前節(jié)點中分配的內(nèi)存,將進程調(diào)度到那個CPU上,這個進程就在對應的內(nèi)存節(jié)點上運行和存儲數(shù)據(jù)


--preferred
在可能的情況下分配內(nèi)存到指定節(jié)點中的內(nèi)存,如果內(nèi)存無法分配到指定的節(jié)點,則返回其他節(jié)點。

Numactl  --preferred=nodes 

必須在啟動程序時指定

必須在啟動腳本上執(zhí)行

[root@python ~]# numactl   --show
policy: default
preferred node: current  (當前節(jié)點)
physcpubind: 0 1 2 3
cpubind: 0
nodebind: 0
membind: 0

9 使用 numad 進行自動化 NUMA 關聯(lián)管理

1 概述

numad 是一種自動化的 NUMA 關聯(lián)管理后臺程序。它對系統(tǒng)中的 NUMA 拓撲及資源用量進行監(jiān)控,以便動 態(tài)地改善 NUMA 資源配置及管理。


numad 也同樣提供預先安置咨詢服務,這一服務可以通過不同的作業(yè)管理系統(tǒng)來查詢,并為處理器 CPU 的 初始綁定及內(nèi)存資源提供幫助。無論 numad 是以可執(zhí)行程序或服務在運行,這一預先安置咨詢都可用。

根據(jù)系統(tǒng)負載,numad 可對基本性能有50%的提高,要達到此性能的優(yōu)勢,numad會周期性的訪問 /proc 文件系統(tǒng)中的信息以便架空每個節(jié)點中可用的系統(tǒng)資源,該守護進程然后會嘗試在有足夠內(nèi)存和CPU資源的NUMA節(jié)點中放置大量進程已優(yōu)化NUMA性能,目前進程管理閾為至少是一個CPU的50%,且至少有300MB內(nèi)存,numad會嘗試維護資源換使用水平,并在需要時通過在NUMA節(jié)點間一共進程平衡分配。


numad 還提供預布置建議服務,可以通過各種任務管理系統(tǒng)進行查詢以便提供CPU起始捆綁以及進程內(nèi)存資源的支持,這個預布置建議服務無論系統(tǒng)中是否運行numad都可以使用。

2 numad 有兩種使用方式
1 作為服務使用

將 numad 作為服務運行時,它嘗試基于當前系統(tǒng)的工作負載來動態(tài)調(diào)整系統(tǒng)。其活動記錄在 /var/log/numad.log。 如需啟動服務,運行: # systemctl start numad.service 如需重啟后服務持久,運行:

# chkconfig numad on 
2 作為可執(zhí)行文件使用

在命令行使用 numad

將 numad 作為執(zhí)行表使用,只需運行:

numad

numad 運行的時候,其活動被記錄在 /var/log/numad.log。

它會持續(xù)運行直到被以下命令終止:

numad -i 0

終止 numad 不會移除它所做的提高 NUMA 關聯(lián)的變更。如果系統(tǒng)使用有顯著的變化,再次運行 numad 能 調(diào)整關聯(lián)來提高新條件下的性能。

如需將 numad 管理限制為特定進程,
用下列選項來啟動它:

numad -S 0 -p pid -p 

pid該選項將指定的 pid 添加到顯式的包含列表中。當指定的進程達到 numad 進程的顯著門限值,指 定的進程才會被管理。
-S 0

它將進程掃描的類型設置為 0,這會將 numad 管理限制到顯式包的進程。

4 調(diào)度策略

1 概述

Linux 調(diào)度器執(zhí)行大量的調(diào)度原則,以此決定線程運行的位置和時長。調(diào)度原則主要有兩類:普通原則和實時原則。普通線程用于普通優(yōu)先級任務,實時原則用于具有時效性且必須無中斷完成的任務。

實時線程不受時間間隔的控制,這意味著它們將一直運行直至它們阻攔、退出、主動讓步或是被更高優(yōu)先權(quán)的線程預先安置。最低優(yōu)先權(quán)的實時線程會先于其他普通原則的線程進行調(diào)度。

2 調(diào)度原則

調(diào)度程序復制保證系統(tǒng)中的CPU處于忙碌狀態(tài),Linux 調(diào)度程序采用調(diào)度策略,他可以決定何時以及在具體CPU何種線程運行的時間

1 實時策略(優(yōu)先級進行掃描)
1 SCHED_FIFO

靜態(tài)優(yōu)先調(diào)度策略,每一個線程有固定的優(yōu)先級權(quán)限,該調(diào)度程序根據(jù)優(yōu)先級權(quán)限順序掃描,sched_fifo線程列表,并調(diào)度準備好運行的最高優(yōu)先權(quán)限的線程,這個線程會運行到他阻斷,退出或者被更好的線程搶占準備運行的時候,這一策略建議無法運行較長時間且具有時效性的任務使用

即使是最低優(yōu)先權(quán)的實時線程也會比非實時策略線程提前調(diào)度,如果只有一個實時線程,則sched_fifo優(yōu)先權(quán)值就無所謂了,只有那些內(nèi)核線程的優(yōu)先級才是實時的優(yōu)先級,一個 SCHED_FIFO 線程的優(yōu)先級級別可以是 1 至 99 之間的任何整數(shù),99 是最高優(yōu)先 級。紅帽建議一開始使用較小的數(shù)字,在確定了延遲問題后再增加優(yōu)先級。


由于實時線程不受時間間隔的控制,紅帽不推薦設置 99 優(yōu)先級。這會使同優(yōu)先級的進程成為遷移線程 或監(jiān)控線程,如果線程進入一個計算機回路且這些線程被阻攔,它們將無法運行。這種情況下,單處理 器系統(tǒng)最終會暫停。


管理員可以限制 SCHED_FIFO 的帶寬以防止實時應用程序的程序員啟用獨占處理器的實時任務。

/proc/sys/kernel/sched_rt_period_us
該參數(shù)以微秒為單位來定義時間,是百分之百的處理器帶寬。默認值為 1000000 μs, 或1秒。
/proc/sys/kernel/sched_rt_runtime_us

該參數(shù)以微秒為單位來定義時間,用來運行實時線程。默認值為 950000 μs, 或0.95秒

2 SCHED_RR

輪訓調(diào)度,也會為sched_rr 線程提供1-99之間的固定優(yōu)先權(quán),但有相同優(yōu)先權(quán)的線程使用特定或者時間片輪訓方式進行調(diào)度,sched_rr_get_interval 系統(tǒng)調(diào)用所有時間片返回的數(shù)值,但用戶無法設定時間篇持續(xù)大時間,這個策略對于具有相同優(yōu)先級運行的多線程是有幫助的。


修改進程的實時優(yōu)先級

[root@python ~]# chrt   -h
Show or change the real-time scheduling attributes of a process.

Set policy:
 chrt [options] <priority> <command> [<arg>...]
 chrt [options] --pid <priority> <pid>

Get policy:
 chrt [options] -p <pid>

Policy options:
 -b, --batch          set policy to SCHED_BATCH
 -d, --deadline       set policy to SCHED_DEADLINE
 -f, --fifo           set policy to SCHED_FIFO
 -i, --idle           set policy to SCHED_IDLE
 -o, --other          set policy to SCHED_OTHER
 -r, --rr             set policy to SCHED_RR (default)

Scheduling options:
 -R, --reset-on-fork       set SCHED_RESET_ON_FORK for FIFO or RR
 -T, --sched-runtime <ns>  runtime parameter for DEADLINE
 -P, --sched-period <ns>   period parameter for DEADLINE
 -D, --sched-deadline <ns> deadline parameter for DEADLINE

Other options:
 -a, --all-tasks      operate on all the tasks (threads) for a given pid
 -m, --max            show min and max valid priorities
 -p, --pid            operate on existing given pid
 -v, --verbose        display status information

 -h, --help     顯示此幫助并退出
 -V, --version  輸出版本信息并退出

chrt 指定優(yōu)先級 -p 指定pid
如果不指定使用的,則默認使用RR調(diào)度策略

2 一般策略(用戶進程)

守護進程和批處理進程

交互進程

SCHED_OTHER 或者 SCHED_NORMAL


SCHED_OTHER redhat 7 默認調(diào)度策略,該策略使用完全公平調(diào)度程序(CFS)提供對所有使用此策略線程的提供公平訪問時間段,CFS建立了動態(tài)優(yōu)先權(quán)限列表,部分是根據(jù)每個進程線程的niceness 值,這樣可為用戶提供一些間接控制進程優(yōu)先權(quán)的權(quán)利,但這個動態(tài)優(yōu)先權(quán)列表只能由CFS直接修改,此調(diào)度算法適用于具有大量線程或數(shù)據(jù)吞吐量優(yōu)先時最有用,因為其能夠隨著時間而更為有效的調(diào)度線程。


用于低優(yōu)先權(quán)任務

SCHED_BATCH
SCHED_IDLE

3 常用的調(diào)度策略

sched rr

chrt -r

1-99 數(shù)字越大,優(yōu)先級越高

sched_other
自動內(nèi)核自動提供動態(tài)優(yōu)先級

手動 nice renice

100-139 數(shù)字越小,優(yōu)先級越高

4 策略選擇

為程序線程選擇正確的調(diào)度程序策略不總是那么直接了當?shù)娜蝿?,通常應在關鍵時間或者需要迅速調(diào)度期望不能延長運行時間的重要任務中實施策略,一般策略通??梢援a(chǎn)生比實時策略好的數(shù)據(jù)流量結(jié)果,因為它們讓調(diào)度進程更有效的運行(及就是它們不需要經(jīng)常重新調(diào)度占先的進程),


如果需要管理大量進程,且擔心數(shù)據(jù)流量(每秒的網(wǎng)絡數(shù)據(jù)包,寫入磁盤等),那么請使用SCHED_OTHER,并讓系統(tǒng)為你管理CPU


如果擔心事件響應時間延遲,則使用SCHED_FIFO,如果只有少量的線程,則可以考慮隔離CPU插槽,并將線程移動到那個插槽的核中以便沒有其他線程與之競爭。

3隔離CPU

1 isolcpus 開機隔離CPU

用戶可以使用isolcpus開機參數(shù)來從調(diào)度器隔離一個或多個CPU,以此防止調(diào)度在此CPU上調(diào)度任何用戶空間的線程。


一旦CPU被隔離,用戶需要手動分配進程至被隔離的CPU,或者使用CPU相關系統(tǒng)呼叫或者numactl命令


將系統(tǒng)中第三和第六 CPU 隔離至第八 CPU,添加如下至內(nèi)核命令行:

 isolcpus=2,5-7 
2 Tuna 工具隔離CPU

用戶也可使用 Tuna 工具來隔離CPU。Tuna 可以隨時隔離 CPU,不僅僅局限于啟動時。但這種隔離方法與 isolcpus 參數(shù)略有不同,并且目前尚未實現(xiàn)與 isolcpus 相關的性能收益。


在超過 32 個處理器的系統(tǒng)中,用戶須將 smp_affinity 的值限定為分散的 32 位組。例如,如果一開始只 想使用 64 位處理器系統(tǒng)中的 32 位處理器來處理一個中斷請求,可以運行:

echo 0xffffffff,00000000 > /proc/irq/IRQ_NUMBER/smp_affinity

3 使用 tuna 配置 CPU,線程和中端關聯(lián)

Tuna 能夠控制CPU,線程及中斷關聯(lián),并能夠給其所能控制的每類實體提供大量操作,

要從一個或多個特定的 CPU 中移除所有線程,請運行如下命令,使用想要隔離的 CPU 數(shù)量來替換 CPUs。

tuna --cpus CPUs --isolate 

要在可運行特定線程的 CPU 列表中加入一個 CPU,請運行如下命令,使用想要加入的 CPU 數(shù)量來替換 CPUs。

tuna --cpus CPUs --include

要將一個中斷請求移動至特定的 CPU,請運行如下命令,用 CPU 數(shù)量替換 CPU,用想要移動且使用逗號分 隔的中斷請求列表替換 IRQs。

tuna --irqs IRQs --cpus CPU --move 

此外,用戶可以使用如下命令來找到所有 sfc1* 模式的中斷請求。

tuna -q sfc1* -c7 -m -x 

要改變一個線程的策略和優(yōu)先級,請運行如下命令,使用想要改變的線程替換 thread,使用需要的線程運行策 略名稱替換 policy,用從 0(最低優(yōu)先級)至 99(最高優(yōu)先級)間的一個整數(shù)替換 level。

tuna --threads thread --priority policy:level

4 中斷和中斷請求(IRQ) 調(diào)解

RIQ中斷請求是用于服務的請求,從硬件層面發(fā)出,可使用專用硬件線路或者跨硬件總線的信息數(shù)據(jù)包發(fā)出中斷。


啟用中斷后,接受IRQ 后會提示切換到中斷上下文,內(nèi)核中斷調(diào)度代碼會搜索IRQ 號碼機器關聯(lián)的注冊中斷服務路由ISR 列表,并按順序調(diào)用ISR,ISR 會確認中斷并忽略來自同一IRQ 的多余中斷,然后在延遲的句柄中排隊完成中斷處理,并忽略以后的中斷來結(jié)束ISR

[root@master ~]# cat /proc/interrupts 
            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       
   0:        148          0          0          0          0          0          0          0   IO-APIC-edge      timer
   1:         13          0          0          0          0          0          0          0   IO-APIC-edge      i8042
   8:          1          0          0          0          0          0          0          0   IO-APIC-edge      rtc0

/proc/interrupts 文件列出每個IO 設備中每個CPU 的中斷數(shù),每個CPU 核處理的中斷數(shù),中斷類型,。以及用逗號分開的注冊為接受中斷的驅(qū)動程序列表


IRQ 有一個關聯(lián)的“類似”屬性 smp_affinity ,該參數(shù)可以定義運行IRQ 執(zhí)行ISR 的CPU和,文件中,可以提高程序的性能,方法是為一個或多個具體的CPU 核分配中斷類似性和程序線程類似性,這可讓緩存在指定的中斷和程序線程之間共享


具體IRQ 數(shù)的中斷近似性值是保存的相關的/proc.irq.IRE_NUMBER/smp_affinity 文件中,可以作為root 用戶查看并修改該值,保存在這個文件中的值是一個十六進制字節(jié)掩碼,代表系統(tǒng)中所有CPU 核。

[root@master ~]# grep  eth0 /proc/interrupts 
  18:      24909          0          0          0          0          0          0          0   IO-APIC-fasteoi   eth0

[root@master ~]# cat /proc/irq/18/smp_affinity  f 表示所有CPU 
00000000,00000000,00000000,000000ff

對于某些特定的硬件,在其注冊時就會保存在某些CPU 上

對于某些公共的硬件,如網(wǎng)卡,硬盤等有可能是內(nèi)核不斷的調(diào)度的

大多數(shù)硬件都是CPU0 上處理的

Smp_affinity 的默認值是f,及可為系統(tǒng)中的任意CPU 提供IRQ,將這個值設定為1,如下

[root@master ~]# echo  1 >  /proc/irq/18/smp_affinity
[root@master ~]# cat /proc/irq/18/smp_affinity
00000000,00000000,00000000,00000001

隔離中斷
將某些在指定的CPU上的中斷進行調(diào)整到另外的cpu上,然后再進行綁定

[root@master ~]# echo  1 >  /proc/irq/18/smp_affinity
[root@master ~]# cat /proc/irq/18/smp_affinity
00000000,00000000,00000000,00000001

某特定進程綁定在特定CPU上,且該CPU 不處理任何其他請求,也不處理任何中斷,避免中斷上下文和進程上下文之間的切換

二 內(nèi)存調(diào)優(yōu)

1 注意事項

對于適中的工作負載,紅帽企業(yè)版 Linux 7 會默認優(yōu)化。如果用戶的應用程序或用例需要大量的內(nèi)存,那么改變系統(tǒng)處理虛擬內(nèi)存可以提高應用程序的性能。

2 頁面和內(nèi)存管理

1 頁面管理

物理內(nèi)存管理區(qū)稱為頁面,每一個頁面的物理位置都映射到一個虛擬位置以便于處理器能夠訪問內(nèi)存,這種映射存儲于一種叫做頁面表的數(shù)據(jù)結(jié)構(gòu)中。物理內(nèi)存被組織成葉匡,而線性地址被組織成頁面,數(shù)據(jù)的存放都是以頁面的格式進行定義的,頁面的數(shù)據(jù)有可能被映射到非連續(xù)的物理葉匡中,


默認情況下,一個頁面大約有4kb,1M 內(nèi)存等于256個頁面,1GB 內(nèi)存等于256000個頁面,CPU有內(nèi)嵌的內(nèi)存單元,這些單元中包含著這些列表,每個頁面都使用也表條目參考。,由于頁面的默認大小很小,因此用戶需要很多頁面來管理大量內(nèi)存,其頁面表只能存儲有限的地址映射,增加其存儲地址映射的數(shù)量既昂貴又困難,因此要考慮到將性能等級保持在內(nèi)存需求范圍內(nèi),32 位系統(tǒng)一般支持4k的頁面葉匡和4M的,64 位 4k 和 2M 的葉匡。

2 超大轉(zhuǎn)義后備緩沖器(huge TLB)

將物理內(nèi)存地址轉(zhuǎn)義為虛擬內(nèi)存地址是內(nèi)存管理的一部分,物理地址和虛擬地址的映射關系保存在名為頁表的數(shù)據(jù)結(jié)構(gòu)中,因為每個地址映射讀取頁表會很消耗時間和資源,所以最近使用的地址都有緩存,這個緩存就是轉(zhuǎn)移后備緩沖器 .


但TLB 只能緩存大量的地址映射,如果所要求的地址映射沒有在TLB中,則必須扔讀取頁表已決定物理到虛擬地址的映射,這就是TLB缺失,因為內(nèi)存要求與用來緩存TLB 中地址映射之間的關系,所以有大內(nèi)存要求的程序比使用較少內(nèi)存的程序更容易受TLB缺失的影響,因為每一個缺失都涉及頁表讀取,因此盡量避免這些缺失很重要。


超大轉(zhuǎn)移后備緩沖器(huge TLB)可以很大片管理內(nèi)存,以便一次可以緩存更多地址,這樣可以減少TLB 缺失的可能性,進而改進有大內(nèi)存要求的程序的程序性能。

紅帽企業(yè)版 Linux 提供大型轉(zhuǎn)換后背緩沖區(qū) (大型 TLB),可以將內(nèi)存分為大片段進行管理。這使大量的地址映射能同時進行緩存,以此降低 TLB 缺失的可能性,并提高需要大內(nèi)存的應用程序的性能。

3 大內(nèi)存和透明頁

當數(shù)據(jù)訪問時,是裝入時長訪問的數(shù)據(jù),而不是裝入所有數(shù)據(jù),此時如果需要訪問其他沒有被裝載的數(shù)據(jù),則會發(fā)生數(shù)據(jù)異常,此時需要通過IO的方式來進行查詢處理

對于非常吃內(nèi)存的進程,進行開啟其大內(nèi)存頁的功能,這就是一種調(diào)優(yōu)方式


讓系統(tǒng)管理大量內(nèi)存的兩種方式

1 增加硬件內(nèi)存管理單元的頁表數(shù)
2 增加大頁面

第一種方式很貴,現(xiàn)在的處理器中的硬件內(nèi)存管理單元只支持數(shù)百或者數(shù)千條頁條目,另外適用于管理數(shù)千頁面硬件和內(nèi)存管理算法可能無法很好的管理百萬甚至數(shù)億頁面,這會造成性能問題,但程序序號使用比內(nèi)存管理單元更多的頁面,該系統(tǒng)就會回退到緩慢的基于軟件的內(nèi)存管理,從而造成整個系統(tǒng)運行緩慢。

超大頁面時2MB和1GB大小的內(nèi)存塊,2MB使用的頁表可管理多GB,而1GB頁是TB內(nèi)存的最佳選擇


超大頁面必須在引導時分配,他們很難手動管理,且經(jīng)常需要更改代碼以便可以有效使用,因此紅帽企業(yè)版Linux 也部署了透明超大頁面(THP)
THP 是一個提取層,可自動創(chuàng)建。管理和使用超大頁面的大多數(shù)方面

超大頁面必須引導時配置,而透明大頁面可以隨時配置

THP 系統(tǒng)管理員和開發(fā)者減少了很多使用超大頁面的復雜性,因為THP的目的是改進性能,所以其開發(fā)者已在各種系統(tǒng)、配置和負載中測試并優(yōu)化的THP ,這樣可讓THP 的默認設置改進大多數(shù)系統(tǒng)配置性能


Varish 和透明大頁面不兼容,大頁面可能會導致內(nèi)存泄露

Varish 在2M的頁面上性能很一般

透明大頁面管理職能用于異步內(nèi)存段的管理

紅帽企業(yè)版 Linux 通過靜態(tài)大型分頁來給每個頁面管理大內(nèi)存的能力,靜態(tài)大型分頁可以分配到1GB大小,但其難以管理,必須在啟動時就分配好。


透明大型分頁很大程度上是之余靜態(tài)大型頁面的一個自動選擇。透明大型頁面大小為 2 MB 且默認啟動。它們有時會干擾對延遲敏感的應用程序,因此常常在延遲嚴重時被禁用。

2 監(jiān)控及診斷性能問題

紅帽企業(yè)版Linux 7 提供大量有用工具來監(jiān)控系統(tǒng)性能與系統(tǒng)用內(nèi)存相關的性能問題

1 vmstat 監(jiān)控內(nèi)存使用量

Vmstat 由procps-ng 數(shù)據(jù)包提供,輸出用戶系統(tǒng)進程,內(nèi)存,網(wǎng)頁,字塊輸入/輸出,中斷以及CPU的活動等報告,


具體見下:

https://blog.51cto.com/11233559/2152153

2 用 valgrind 分析應用程序的內(nèi)存使用量

1 安裝

Valgrind 是一個為用戶提供空間二進制文件測量方法的框架。它包含大量的工具來概述和分析程序性能。本章列出的 valgrind 工具能幫助用戶檢測內(nèi)存錯誤,例如未初始化的內(nèi)存使用和不適當?shù)膬?nèi)存分配及解除分配。
要使用 valgrind 或其工具,請安裝 valgrind 數(shù)據(jù)包:

yum install valgrind
2 memcheck

memcheck 是默認的valgrind工具,其檢測并報告出大量難以檢測和診斷到的內(nèi)存錯誤,如

不應發(fā)生的內(nèi)存訪問

使用未定義或者未初始化的值

不正確的釋放堆地址

指示字重疊

內(nèi)存泄漏


memcheck 只能報告這些錯誤,但并不能阻止它們發(fā)生,如果程序以通常會引起段錯誤的方式來訪問內(nèi)存的話,段錯誤仍然會發(fā)生,但memcheck會在發(fā)生錯誤之前立即記錄一條信息

由于 memcheck使用測量工具,通過memchek執(zhí)行的應用程序會比平常運行起來慢10-30倍。


要在應用程序上運行 memcheck, 請執(zhí)行以下指令:

valgrind --tool=memcheck application

用戶也可以使用以下選項來使 memcheck 的輸出集中在特定的問題類型上。

3 參數(shù)詳解

?--leak-check
在應用程序結(jié)束運行后,memcheck 會搜索內(nèi)存泄露問題。默認值為 --leakcheck=summary,在找到內(nèi)存泄露時會顯示其數(shù)量。用戶可以指定 --leak-check=yes 或 --leak-check=full 來輸出每個泄露問題的詳情。禁用請設定 --leak-check=no。


?--undef-value-errors
默認值為 --undef-value-errors=yes,使用未定義的值時會報錯。用戶還可設定 --undef-value-errors=no ,這將禁用此報告并略微提高 Memcheck 的速度。


?--ignore-ranges
在查看可尋址內(nèi)存時指定一個或多個 memcheck 應忽略的范圍,例如, --ignoreranges=0xPP-0xQQ,0xRR-0xSS。

3 cache grind

使用 cache grind 分析緩存使用量

cachegrind 會模擬應用程序與系統(tǒng)緩存層析結(jié)構(gòu)和分支預測器之間的交互作用,他會追蹤模擬的以及指令和數(shù)據(jù)緩存使用情況,以此檢測出該級緩存與代碼間不良的交互作用。它也會追蹤最后一級緩存(第二或第三極)以便追蹤內(nèi)存訪問。這樣的情況下,使用 cachegrind 的應用程序運行起來會比通常慢 20-100 倍。


Cachegrind 會收集應用程序執(zhí)行期間的統(tǒng)計數(shù)據(jù),并且將概要輸出至操作臺。要在應用程序中運行


cachegrind ,請執(zhí)行以下指令:

valgrind --tool=cachegrind application

用戶也可以使用以下選項來讓 cachegrind 的輸出集中在一個特定的問題上。

參數(shù)詳解

?--I1
指定大小、關聯(lián)性以及第一級指令緩存行大小的方法如下:--I1=size,associativity,line_size。


?--D1
指定大小、關聯(lián)性以及第一級數(shù)據(jù)緩存行大小的方法如下:--
D1=size,associativity,line_size.。


?--LL
指定大小、關聯(lián)性以及最后一級緩存行大小的方法如下:--
LL=size,associativity,line_size。


?--cache-sim
啟用或禁用緩存訪問和缺失數(shù)量的集合是默認啟用的(--cache-sim=yes)。禁用此集合以及 --branch-sim 來使 cachegrind 不收集信息。


?--branch-sim
啟用或禁用分支指令及錯誤預測數(shù)量的集合是默認啟用的(--branch-sim=yes)。禁用此集合以及 --cache-sim 來使 cachegrind 不收集信息。
Cachegrind 寫入詳細的分析信息至每個進程 cachegrind.out.pid 文件,其中, pid 是進程標識符。這一詳細信息可以使用 cg_annotate 工具進行進一步處理,方法如下:

cg_annotate cachegrind.out.pid

Cachegrind 也提供 cg_diff 工具,可以更為容易地在代碼變化前后對程序性能進行記錄。要對比輸出文
件,請執(zhí)行以下命令:先用原始配置輸出文件替代,再用后續(xù)配置輸出文件替代。

cg_diff first second
4 使用massif分析堆??臻g

Massif 測量特定應用程序的堆空間。它測量可用空間和額外用來記錄和調(diào)準的空間。massif 有助于用戶了解減少應用程序內(nèi)存使用的方法,以便提高運行速度,減少應用程序耗盡系統(tǒng)交換空間的可能性。使用massif 執(zhí)行的應用程序運行起來比平常通常慢 20 倍左右。


要在一個應用程序中運行 massif,請執(zhí)行如下命令:

valgrind --tool=massif application

用戶也可以使用以下選項來將 massif 的輸出集中在一個特定的問題上。
?--heap
設定 massif 是否分析堆。默認值為 --heap=yes。要禁用堆分析可設置為 --heap=no。


?--heap-admin
堆分析啟用時要設定每個用于管理的數(shù)據(jù)塊字節(jié)數(shù)。默認值為 8 字節(jié)。


?--stacks
設定 massif 是否分析堆。默認值為 --stack=no 是由于堆分析會大大減緩 massif。將這一選項設置為 --stack=yes 來啟用堆分析。要注意的是,massif 會假設主要的堆始于零值,這是為了更好地顯示與所分析的應用程序相關的堆尺寸的變化。


?--time-unit
設定 massif 收集分析數(shù)據(jù)的間隔。默認值為 i(執(zhí)行指令)。用戶也可以指定 ms(毫秒或?qū)崟r)和 B(分配或收回的堆棧字節(jié)數(shù))。檢查分配的字節(jié)數(shù)有利于短期運行的應用程序及測試,因為對于不同的硬件來說,它是最具重復性的。


Massif 將分析數(shù)據(jù)輸出至 massif.out.pid 文件中,該文件中的 pid 是指定應用程序的進程標識符。ms_print 工具將此分析數(shù)據(jù)繪成圖表,以此顯示執(zhí)行應用程序的內(nèi)存消耗,也包括峰值內(nèi)存分配點負責分配的站點詳情。要繪制 massif.out.pid 文件中的數(shù)據(jù),請執(zhí)行以下指令:

ms_print massif.out.pid

3 配置工具

1 簡介

內(nèi)存使用量往往是通過設置一個或多個內(nèi)核的參數(shù)值來進行配置的,這些參數(shù)可以通過改變在/proc文件系統(tǒng)中的文件內(nèi)容來進行暫時的設置,或者是通過設置系統(tǒng)核心參數(shù)工具來進行永久設置,此工具由procps-ng數(shù)據(jù)包提供


例如,要將 overcommit_memory 參數(shù)暫時設置為 1,請運行以下指令:

echo 1 > /proc/sys/vm/overcommit_memory

要永久設置這個值,請運行以下指令:

sysctl vm.overcommit_memory=1 

暫時設置一個參數(shù)有利于決定此參數(shù)對系統(tǒng)的影響。用戶可以在確定了參數(shù)值有預期的效果之后再將其設置為 永久值。

2 配置大頁面

大頁面依賴于連續(xù)的內(nèi)存區(qū)域,因此最好在啟動時,也就是內(nèi)存變?yōu)榕袛嘀熬投x好大頁面,為此,可添加一下參數(shù)至內(nèi)核啟動命令行:

hugepages
啟動時在內(nèi)核中定義 2MB 定值大頁面的數(shù)量。默認值為 0。只有在系統(tǒng)擁有足夠的物理持續(xù)性空閑 頁面時才能進行分配(或是收回)大頁面。此參數(shù)保留的頁面不能用于其他目的。


此值可以在啟動后通過改變 /proc/sys/vm/nr_hugepages 文件值來調(diào)節(jié)。 更多詳情請參閱相關內(nèi)核文檔,默認安裝于 /usr/share/doc/kernel-doc- kernel_version/Documentation/vm/hugetlbpage.txt 中。

/proc/sys/vm/nr_overcommit_hugepages

通過超量使用內(nèi)存來定義系統(tǒng)所能創(chuàng)建和使用的最大數(shù)量的額外大頁面。在此文件中寫入任何非零 的值,表示系統(tǒng)包含此數(shù)目的大頁面,在不變的頁面池耗盡后,這些大頁面便來自于內(nèi)核的常規(guī)頁 面池。由于這些額外的大頁面是未使用過的,因此它們會釋放并返回至內(nèi)核的常規(guī)頁面池中。

3 配置系統(tǒng)內(nèi)存容量

虛擬內(nèi)存參數(shù)

此處參數(shù)都早/proc/sys/vm中,除非另有標明


dirty_ratio: 一個百分比值,當整個系統(tǒng)內(nèi)存的這一百分比值被修改時,系統(tǒng)會通過運行pdflush 將改動寫入磁盤,默認是20%。


dirty_background_ratio: 一個百分比值,當整個系統(tǒng)內(nèi)存的這一百分比值被修改時,系統(tǒng)會在后臺將改動寫入磁盤,默認是10%。


overcommit_memory: 定義用來決定接受或拒絕一個大內(nèi)存請求的注意事項

默認值為0,默認情況下,內(nèi)核執(zhí)行探索發(fā)內(nèi)存超量使用,是通過估算可用內(nèi)存大小和由于太大而失敗的請求來進行處理的,但是由于內(nèi)存分配使用的是探索算法而不是精確算法,這一設置導致超載內(nèi)存是可能的。

當這一個參數(shù)設置成1時,內(nèi)核不執(zhí)行內(nèi)存超量使用處理,這增加了內(nèi)存超量的可能性,但也提高了內(nèi)存密集型任務的性能。

當這一參數(shù)設置成2時,內(nèi)核拒絕請求,及請求的內(nèi)存大于或等于總的可用交換空間,以及在overcommit_ratio中指定的物理RAM的百分比,這減少了超量使用內(nèi)存的風險,但僅在系統(tǒng)交換空間大于物理內(nèi)存時推薦此設置。


overcommit_ratio

當 overcommit_memory 設置為2時,設定所考慮的物理RAM的百分比,默認值為50.


max_map_count
定義一個進程可以使用的最大內(nèi)存映射區(qū)域數(shù)量,默認(65530) 適用于大部分情況,如果應用程序需要映射超過此數(shù)量的文件,可增加此值。


min_free_kbytes

指定千字節(jié)的最小數(shù)量,使之在整個系統(tǒng)中都保持空閑,這是用來給每個低內(nèi)存區(qū)決定一個合適的值,每一個低內(nèi)存區(qū)都是按照其大小比例分配了大量保留的空閑頁面。

警告:
極值會損壞用戶的系統(tǒng)。將 min_free_kbytes 設置為一個極小的值以防止系統(tǒng)回收內(nèi)存,回收內(nèi)存會導致系統(tǒng)鎖死,以及 OOM-killing 進程。但是,將 min_free_kbytes 設置過高 (例如,整個系統(tǒng)內(nèi)存的 5–10% )會使系統(tǒng)立即進入一種內(nèi)存不足的狀態(tài),導致系統(tǒng)花太多時間來回收內(nèi)存。


oom_adj

在系統(tǒng)內(nèi)存不足,并且panic_on_oom參數(shù)設置成0的情況下,oom_killer 功能會結(jié)束進程,直至系統(tǒng)可以恢復,從提高的oom_score 進程開始。

oom_adj 參數(shù)有助于確定一個進程的oom_score,此參數(shù)以每一個進程標識符為單位進行設置,值為-17時會禁用進程的oom_killer,其他有效值從-16到15 由一個調(diào)整過的進程而產(chǎn)生的進程會繼續(xù)該進程的 oom_score。


?swappiness
一個從 0 到 100 的值可以控制系統(tǒng)交換的程度。高值優(yōu)先考慮系統(tǒng)效率,并在進程不活躍時主動交換物理內(nèi)存耗盡的進程。低值優(yōu)先考慮響應度,并且盡可能久地避免交換物理內(nèi)存耗盡的進程,默認值為 60。

4 文件系統(tǒng)參數(shù)

此處中的參數(shù)都在/proc/sys/fs內(nèi),除非另有標明。

aio-max-hr
定義在異步輸入/輸出環(huán)境中允許的最大事件數(shù)量,默認值為65536,修改此值不會預分配或改變?nèi)魏蝺?nèi)核數(shù)據(jù)結(jié)構(gòu)的大小。


file-max

定義內(nèi)核分配最大的文件句柄數(shù)量,默認值與內(nèi)核中的files_stat.max_files 值相匹配,將此值設置為最大值NR_FILE(8192,在紅帽企業(yè)版Linux中)或是以下結(jié)果:

(mempages * (PAGE_SIZE / 1024)) / 10

增加此值可以解決由于缺少可用文件句柄而引起的錯誤

5 內(nèi)核參數(shù)

此處中的參數(shù)都在/proc/sys/kernel內(nèi),除非另有標明。


msgmax

msgmax 以字節(jié)為單位,定義任何一個在信息隊列中的信息可能的最大值,該值不能超過隊列的大小(msgmnb),默認值為65536Z


msgmnb
以字節(jié)為單位,定義每一個信息隊列的最大值,默認是65536


msgmni
定義信息隊列標識符的最大數(shù)量(以及隊列的最大數(shù)量),在64位架構(gòu)的系統(tǒng)中,默認值為1985.


shmall
定義頁面上共享內(nèi)存的總量,這些內(nèi)存是系統(tǒng)可以同時使用的

shmmni
定義系統(tǒng)范圍內(nèi)最大的共享內(nèi)存片段數(shù)量,在所有系統(tǒng)中默認值為4096


threads-max
定義系統(tǒng)范圍內(nèi)內(nèi)核能同時使用的最大線程量,默認值與內(nèi)核參數(shù)max_threads 相同,或為一下結(jié)果:

     mempages / (8 * THREAD_SIZE / PAGE SIZE )

最小值為20

三 存儲和文件系統(tǒng)

1 注意事項

存儲和文件系統(tǒng)性能的合理設置很大程度上取決于存儲目的,I/O和文件系統(tǒng)性能會受到下列因素的影響:

1 數(shù)據(jù)寫入或者讀取模式

2 數(shù)據(jù)重新排列與底層架構(gòu)

3 塊大小

4 文件系統(tǒng)大小

5 日志大小和位置

6 記錄訪問次數(shù)

7 確保數(shù)據(jù)可靠性

8 預取數(shù)據(jù)

9 預先分配磁盤空間

10 文件碎片

11 資源爭用

2 固態(tài)硬盤

SSD(固態(tài)硬盤)使用閃存芯片而非旋轉(zhuǎn)磁盤存儲永久數(shù)據(jù),它們?yōu)檫壿媺K地址內(nèi)的全部數(shù)據(jù)提供恒定的訪問時間,而且不會像它們旋轉(zhuǎn)的對應物那樣出現(xiàn)可測量的搜尋成本,每千兆字節(jié)的存儲空間更昂貴且存儲密度更好,但比HDD延遲時間短,吞吐量更大。

當在SSD上使用塊接近磁盤容量,性能通常會降低,降低的程度因供應商的不同而異,在此情況下,所有設備性能都會降低,啟用放棄有助于緩解性能降低。

默認I/O調(diào)度器和虛擬內(nèi)存選項適用于SSD

3 I/O調(diào)度器

1 概述

I/O 調(diào)度決定I/O操作何時運行存儲設備上以及運行多久,其也被稱為I/O elevator(I/O升降機)

2 deadline

除了SATA 磁盤為所有的塊設備的默認I/O調(diào)度器,deadline嘗試為指向到達I/O調(diào)度器的請求提供有保障的延遲,該調(diào)度器適合大多數(shù)用例,尤其適用于讀取操作比寫入操作更頻繁的請求。

將排隊的I/O請求分類為讀或者寫批處理,并按照LBA遞增順序執(zhí)行,默認設置下,讀批處理優(yōu)先于寫批處理,這是因為應用更可能阻止讀取I/O,批處理后,deadline檢查寫入操作因等待處理時間而處于多久的"饑餓"狀態(tài),并且適當?shù)恼{(diào)度下一個讀批處理或者寫批處理,解決批處理的請求數(shù)量,發(fā)出寫批處理的讀批處理數(shù)量,以及請求過期前的時間量都是可以配置的。

3 cfg

默認調(diào)度只適用于標記為SATA 硬盤的設備,完全公平調(diào)度器,cfg,將進程分為三個獨立的類別, 實時,盡其所能和空間,實時類別的進程總是先于盡其所能類別進程執(zhí)行,而盡其所能類別進程總是在空閑類別進程之前執(zhí)行。這意味著實時類別可以時其盡其所能和空閑進程等待處理器時間而忍受"饑餓",默認情況下,分配進程到盡其所能類別


cfg 使用歷史數(shù)據(jù)來因此應用是否會在不就之后發(fā)出更多的I/O請求,如果將有更多的I/O請求,cfq空閑則會等待新的I/O,即使有來自其他進程的I/O在等待處理
因為有空閑趨勢,cfg調(diào)度器不應用于連接不會引起大量搜尋的硬件,除非它為次目的而被調(diào)整,cfg調(diào)度器也不應用于連接其他斷續(xù)工作型調(diào)度器。
cfg 行為是可高度配置的

4 noop

noop I/O調(diào)度器執(zhí)行簡單的FIFO(先進先出)調(diào)度算法,請求通過簡單的最后選中的緩存數(shù)據(jù)在一般塊層合并,對于使用最快存儲的受CPU限制的系統(tǒng),這是最佳的調(diào)度器

4 文件系統(tǒng)

1 XFS

XFS 是一個可靠的,且高度縮放的64位文件系統(tǒng),是Linux redhat7 中默認的文件系統(tǒng),XFS使用基于分區(qū)的分配,具有一些分配方案,包括預先分配和延遲分配,這兩種都會減少碎片和輔助性能,它也支持促進故障恢復的元數(shù)據(jù)日志,當掛載并激活時,能夠?qū)FS進行碎片化整理和放大,XFS支持最大容量可達500TB的文件系統(tǒng)。以及最大容量為8EB的文件偏移量。

2 Ext4

Ext4是Ext3文件系統(tǒng)的可縮放擴展,它的默認行為對大部分工作負載是最佳的,然而,它只支持最大容量為50TB的文件系統(tǒng)有一集最大容量為16TB的文件。

3 Btrfs(技術預覽)

Btrfs 是提供縮放性,容錯和方便管理的copy-on-write(寫時復制)文件系統(tǒng),它包括內(nèi)置快照和RAID支持,通過數(shù)據(jù)和元數(shù)據(jù)校驗來提供數(shù)據(jù)的完整性,它也是通過數(shù)據(jù)壓縮提高性能及使用空間的效率,Btrfs作為一種技術預覽,支持最大容量可達50TB的文件系統(tǒng)。Btrfs是最適合桌面存儲和云存儲,

4 GFS2

GFS2是具有極高可用性附加裝置的一部分,為redhat 7 企業(yè)版提供簇文件系統(tǒng)支持,GFS2集群提供所有服務器一致的文件系統(tǒng)圖像,允許服務器在單獨共享文件系統(tǒng)中讀取和寫入。

GFS2 支持最大容量可達150TB的文件系統(tǒng)

5 格式化文件系統(tǒng)注意事項

1 概述

在設備格式化后,文件系統(tǒng)配置的部分決定不能改變,此處必須對格式化后的結(jié)果進行準確的預估

2 大小

按照工作負載創(chuàng)建合理大小的文件系統(tǒng),按相應比例,較小的文件系統(tǒng)的備份次數(shù)也較少,且文件系統(tǒng)檢查需要時間和內(nèi)存也更少,然而,如果您的文件系統(tǒng)太小,性能將因為大量碎片化而降低

3 塊大小

塊是文件系統(tǒng)中的工作單位,塊大小決定單個塊能存儲多少數(shù)據(jù),也因而決定能夠同時讀寫數(shù)據(jù)的最小量

默認塊大小適用于大部分用例,然而,如果塊大小和通常同時讀寫的數(shù)據(jù)數(shù)量一樣大,或者略大時,文件系統(tǒng)將執(zhí)行的更好,存儲數(shù)據(jù)更加有效率,小文件仍將使用一個完整的塊,文件分布在多個塊中,會造成額外的運行時間開銷,另外一些文件系統(tǒng)受限于一定數(shù)量的塊,轉(zhuǎn)而限制文件系統(tǒng)的最大尺寸


使用mkfs 指令格式化設備時,塊大小作為文件系統(tǒng)選項的一部分為被指定,指定塊大小的參數(shù)隨文件系統(tǒng)的變化。

4 幾何

文件系統(tǒng)的幾何與文件系統(tǒng)中數(shù)據(jù)的分布有關,如果系統(tǒng)使用帶狀存儲器,如RAID,可以格式化設備時,通過重新排列數(shù)據(jù)和底層存儲幾何的元數(shù)據(jù)提高性能。


很多數(shù)據(jù)導出的推薦幾何在使用特定文件系統(tǒng)格式化設備時會被自動設置。如果設備沒有導出這些推薦幾何,或您想要變更推薦設置,那么您在使用 mkfs 格式化設備時,需要手動指定幾何 。

5 外部日記

日志文件系統(tǒng)會在執(zhí)行寫操作之前,將寫操作期間發(fā)生的變化記錄到日志文件中,這會降低系統(tǒng)發(fā)生故障,電源故障時日志的存儲設備損壞的可能性,并加速恢復過程

元數(shù)據(jù)密集工作負載設計日志的頻繁更新,大型日志使用更多內(nèi)存,但會較少操作的頻繁性,此外,可通過將設備日志置于和主要存儲一樣快或者更快的專用存儲上,提高帶有元數(shù)據(jù)密集型工作負載的設備的尋道時間。

確保外部日志的可靠性,失去外部日志,設備將導致文件系統(tǒng)的損壞

外部日志必須在格式化時創(chuàng)建,并在掛載期間制定日志設備

6 掛載事件注意事項

1 barrier(屏蔽)

文件系統(tǒng)的barrier確保文件系統(tǒng)元數(shù)據(jù)正確寫入到永久存儲并排序,使用fsync傳輸數(shù)據(jù)在斷電下得以存留,以前的redhat版本中,啟用文件系統(tǒng)barrier會明顯放慢嚴重依賴fsync的應用程序,或者創(chuàng)建和刪除很多小文件

紅帽企業(yè)版Linux 7 中,文件系統(tǒng)barrier性能的得到改善是使禁用的文件系統(tǒng)barrier的性能影響變的極小(小于3%)

2 訪問時間

每次讀取文件,它的元數(shù)據(jù)隨著訪問時間atime更新,這涉及額外的I/O,在大多數(shù)情況下,這項的開銷是小的,因為在默認情況下,前一次訪問時間早于上一次修改時間(mtime)或者狀態(tài)變化(ctime),redhat 7 只會更新atime。

然而,如果更新元數(shù)據(jù)耗時,且并不對準確訪問時間做要求,其可以使用noatime掛載選項掛載文件系統(tǒng),讀取文件時會禁用元數(shù)據(jù)的更新,它也會啟用nodiratime行為,讀取目錄時,該行為禁用元數(shù)據(jù)的更新

3 預讀

預讀行為通過預取可能立即需要的數(shù)據(jù),并將其加載到可比磁盤上更快檢索的頁面緩存中加速文件系統(tǒng)訪問,預讀值越高,系統(tǒng)預取數(shù)據(jù)越早。

redhat 企業(yè)版Linux 根據(jù)對文件系統(tǒng)的檢查,嘗試設置一個合適的預讀值,然后檢查不可能總是準確的,涉及大量數(shù)據(jù)流的量數(shù)據(jù)流的順序I/O的工作負載常常受益于高預讀值,redhat 企業(yè)版 Linux 7 提供的相關存儲調(diào)整配置文件提高預讀值,和使用 LVM 條帶化一樣,但這些調(diào)整對于所有工作負載而言并不總是足夠的。

7 維護

定期丟棄文件系統(tǒng)中不可用的塊是對于固態(tài)硬盤和精簡裝置粗出的建議做法,有兩種丟棄不使用的塊的做法:

batch discard(批量和丟棄)

這種丟棄方式是fstrim指令的一部分,它丟棄文件系統(tǒng)中和管理員指定的標準相匹配的所有不適用的塊
redhat Linux 7 支持 XFS 和 ext4 格式化設備上的 batch discard,這些設備支持實際丟棄操
作即( /sys/block/devname/queue/discard_max_bytes 值不為 0 的 HDD 設備,和/sys/block/sda/queue/discard_granularity 不為 0 的 SSD 設備)。


online discard(網(wǎng)絡丟棄)
這種方式的丟棄操作在掛載時是discard選項配置。實際運行不受用戶干擾,然而,online discard 只丟棄從使用轉(zhuǎn)換到空閑的塊,Redhat 7 支持 XFS 和 Ext4格式化設備上的online discard

紅帽推薦 batch discard,除非要求用 online discard 維持性能,或 batch discard 不可用于系統(tǒng)工作負載。


預先分配

預先分配將硬盤空間標記為已經(jīng)跟將磁盤空間分配給一個文件,為未將數(shù)據(jù)寫入該空間,這可用于限制數(shù)據(jù)碎片和較差的讀取性能,Redhat Linux 7 支持掛載事件內(nèi)XFS,Ext4和GFS2 設備上預先分配空間/

6 使用system tap 監(jiān)控存儲

下列的 SystemTap 示例腳本與存儲性能有關,并可能有助于診斷存儲或文件系統(tǒng)性能問題。默認設置下,
安裝它們至 /usr/share/doc/systemtap-client/examples/io 目錄下。
?disktop.stp
每 5 秒檢查讀/寫硬盤狀態(tài)并輸出在此期間的前十項。
?iotime.stp
顯示用在讀操作和寫操作的時間量,以及讀和寫的字節(jié)量。
?traceio.stp
根據(jù)觀察到的累計 I/O 流,顯示每秒前十項可執(zhí)行文件。
?traceio2.stp
在特定設備進行讀和寫操作時,顯示可執(zhí)行的名稱和進程標識符。
?inodewatch.stp
每當在特定主要/次要設備上的特定 inode 上進行讀或者寫操作時,顯示可執(zhí)行的名稱和進程標識符。
?inodewatch3.stp
每當在特定主要/次要設備上的特定 inode 上屬性發(fā)生變化時,顯示將可執(zhí)行的名稱、進程標識符、和屬性。

6 配置工具

1 配置存儲性能的調(diào)整配置文件

tuned 和 tuned-adm 提供一些旨在為特定用例提高性能的配置意見,下面配置文件有利于提高存儲性能尤為重要

其作用有

1 延遲性能

2 吞吐量性能

如需配置文件系統(tǒng)中的配置文件,請運行下面命令,用您想用的配置文件名稱替代 name。

$ tuned-adm profile name

tuned-adm recommend 命令為系統(tǒng)推薦合適的配置文件,在安裝時它也會為系統(tǒng)設置默認配置文件,因此可用于返回默認配置文件

2 設置默認I/O調(diào)度器

如果設備的掛載選項沒有指定調(diào)度器,可使用默認的I/O調(diào)度器

如需設置默認I/O調(diào)度器,在重啟時通過向內(nèi)核命令行附加elevator參數(shù)來指定想要使用的調(diào)度器,或通過編輯/etc/grub2.conf文件

elevator=scheduler_name

3 為設備配置I/O調(diào)度器

如需設置特定存儲設備的調(diào)度器或者調(diào)度器的優(yōu)先級順序,編輯/sys/block/devname/queue/scheduler 文件,devname 為你預配置的設備的名稱

[root@python ~]# cat  /sys/block/sda/queue/scheduler 
noop [deadline] cfq 
[root@python ~]# echo cfq > /sys/block/sda/queue/scheduler
[root@python ~]# cat  /sys/block/sda/queue/scheduler 
noop deadline [cfq] 
[root@python ~]# 

4 調(diào)整deadline調(diào)度器

使用deadline時,排隊的I/O請求將分為讀批處理和寫批處理,然后按照LBA遞增的執(zhí)行順序調(diào)度,默認設置下,讀批處理優(yōu)先于寫批處理,這是因為在讀I/O上引用程序易被阻止,在批處理被處理后,deadline 會檢查寫操作因等待處理器時間而處于多久的"饑餓"狀態(tài),并合理調(diào)度下一個讀或者寫批處理。


下面參數(shù)形象deadline調(diào)度器行為

fifo_batch

單個批處理中讀操作或者寫操作發(fā)出的數(shù)量,默認為16,值越高,吞吐量也會更多,但也會增加延遲


front_merges

如果您的工作負載從不產(chǎn)生正面合并,可調(diào)整的參數(shù)設置為0,然而,除非你已經(jīng)測試了該檢查的開銷,推薦1為默認值


read_expire

應為服務調(diào)度讀請求中毫秒的數(shù)量,默認值為500(0.5秒)


write_expire

應為服務器調(diào)度寫請求中的毫秒數(shù)量,默認值為5000(5秒)


writes_started

先于寫批處理而處理的讀批處理數(shù)量,該值越高,給讀批處理的優(yōu)先更多

5 調(diào)整cfg 調(diào)度器

使用cfg時,進程分為三類,實時,盡其所能和空間,盡其所能進程之間調(diào)度所有實時進程,而空間進行之前調(diào)度盡其所能進程,默認情況下,進程歸類為盡其所能,可使用ionice 命令手動調(diào)整進程分類

通過使用下面參數(shù)進一步調(diào)整cfg調(diào)度器的行為,這些參數(shù)通過改變/sys/blog/devname/queue/iosched 目錄下的指定文件,基于每個設備設置的

[root@python iosched]# ll
總用量 0
-rw-r--r-- 1 root root 4096 12月 10 23:01 back_seek_max
-rw-r--r-- 1 root root 4096 12月 10 23:01 back_seek_penalty
-rw-r--r-- 1 root root 4096 12月 10 23:01 fifo_expire_async
-rw-r--r-- 1 root root 4096 12月 10 23:01 fifo_expire_sync
-rw-r--r-- 1 root root 4096 12月 10 23:01 group_idle
-rw-r--r-- 1 root root 4096 12月 10 23:01 low_latency
-rw-r--r-- 1 root root 4096 12月 10 23:01 quantum
-rw-r--r-- 1 root root 4096 12月 10 23:01 slice_async
-rw-r--r-- 1 root root 4096 12月 10 23:01 slice_async_rq
-rw-r--r-- 1 root root 4096 12月 10 23:01 slice_idle
-rw-r--r-- 1 root root 4096 12月 10 23:01 slice_sync
-rw-r--r-- 1 root root 4096 12月 10 23:01 target_latency
[root@python iosched]# pwd
/sys/block/sda/queue/iosched

back_seek_max

cfq 將執(zhí)行向后搜尋千字節(jié)計算的最大距離,默認是16kb,向后搜尋通常會損害性能,因此不推薦使用大的值


back_seek_penalty

磁頭在決定向前還是向后移動時,乘法器應用于向后搜尋,默認值為2,如果磁頭位置是1024kb,并且系統(tǒng)中有等距的請求,back_seek_penalty
應用于向后搜尋距離和磁盤向前移動。


fifo_expire_async

異步(緩沖寫入)請求以毫秒計算可能持續(xù)無服務的時間長度,在這個時間過期之后,一個單獨的饑餓的異步請求移動至配送列表,默認值為250毫秒。


fifo_expire_sync

同步(讀取或者O_DIRECT 寫入)請求以毫秒計算的可能持續(xù)無服務的時間長度,在這個時期過期后,一個單獨的"饑餓"的同步請求被移動至配送列表,默認值為125毫秒。


group_idle

默認情況下,此參數(shù)設置為0,表示禁用,設置為1(啟用)時,cfg 調(diào)度器空閑在控制組中發(fā)出I//O的最后進程里,如使用成比例的重量 I/O 控制組,或 slice_idle 設置為 0 (在快速存儲上)會有幫助。


?group_isolation
默認設置下,該參數(shù)設置為 0(禁用)。設置為 1(啟用)時,它提供組之間更強的隔離,但是吞吐量會減少,這是因為公平性用于隨機和順序工作負載。group_isolation 禁用時(設置為0),公平性只提供給順序工作負載。


low_latency

默認設置下,設置參數(shù)為1(啟用),啟用后。通過為設備上發(fā)出I/O的每個進程提供最大為300ms的等待時間,CFG 更注重公平性而非吞吐量,設置參數(shù)為0時(禁用),目標延遲被忽略,每個進程接受完成的時間片


quantum

該參數(shù)定義cfg在同一時間發(fā)給一個設備的I/O請求的數(shù)量,實際上是對隊列深度的限制,默認值為8個請求,使用的設備可能支持更大的隊列深度,但增加隊列深度會導致延遲,尤其是大的順序?qū)懝ぷ髫撦d


slice_async

該參數(shù)定義分配給每個發(fā)出異步I/O請求的進程的時間片長度,默認為40毫秒


slice_idle

該參數(shù)指定等待下一步請求時以毫秒計算的cfg空間時間長度,默認為0(隊列無空間或者 service tree level).默認值對于外部raid 存儲器的推圖量是理想的,由于增加了搜尋操作的整體數(shù)量,從而降低呢哦不non-RAID 存儲器的吞吐量


slice_sync

該參數(shù)定義分配給每個發(fā)出異步I/O請求的進程的時間片長度,默認值為100ms


為快速存儲調(diào)整 cfg

不像無法遭受大搜尋 penalty(懲罰)的硬件推薦 cfq 調(diào)度器,例如快速外部存儲數(shù)列或者固態(tài)硬盤。如果
您需要在此存儲上使用 cfq ,需要編輯下列配置文件:
設置 /sys/block/devname/queue/ionice/slice_idle為0
設置 /sys/block/devname/queue/ionice/quantum 為64
設置 /sys/block/devname/queue/ionice/group_idle為 1

6 調(diào)整noop 調(diào)度器

noop I/O 調(diào)度器主要對使用快速存儲的受CPU限制有用,請求在塊層合并,因此通過編輯/sys/block/sdx/queue/ 目錄中的文件中塊層參數(shù),修改noop 行為

[root@python ~]# echo  noop  >  /sys/block/sda/queue/scheduler
[root@python ~]# cat /sys/block/sda/queue/scheduler 
[noop] deadline cfq 
[root@python ~]# cd /sys/block/sda/queue/iosched/
[root@python iosched]# ll
總用量 0
[root@python iosched]# cd ..
[root@python queue]# pwd
/sys/block/sda/queue
[root@python queue]# ll
總用量 0
-rw-r--r-- 1 root root 4096 12月 10 23:01 add_random
-r--r--r-- 1 root root 4096 12月 10 23:01 discard_granularity
-r--r--r-- 1 root root 4096 12月 10 23:01 discard_max_bytes
-r--r--r-- 1 root root 4096 12月 10 23:01 discard_zeroes_data
-r--r--r-- 1 root root 4096 12月 10 23:01 hw_sector_size
drwxr-xr-x 2 root root    0 12月 10 23:27 iosched
-rw-r--r-- 1 root root 4096 12月 10 23:01 iostats
-r--r--r-- 1 root root 4096 12月 10 23:01 logical_block_size
-r--r--r-- 1 root root 4096 12月 10 23:01 max_hw_sectors_kb
-r--r--r-- 1 root root 4096 12月 10 23:01 max_integrity_segments
-rw-r--r-- 1 root root 4096 12月 10 23:01 max_sectors_kb
-r--r--r-- 1 root root 4096 12月 10 23:01 max_segments
-r--r--r-- 1 root root 4096 12月 10 23:01 max_segment_size
-r--r--r-- 1 root root 4096 12月 10 23:01 minimum_io_size
-rw-r--r-- 1 root root 4096 12月 10 23:01 nomerges
-rw-r--r-- 1 root root 4096 12月 10 23:01 nr_requests
-r--r--r-- 1 root root 4096 12月 10 23:01 optimal_io_size
-r--r--r-- 1 root root 4096 12月 10 23:01 physical_block_size
-rw-r--r-- 1 root root 4096 12月  3 21:14 read_ahead_kb
-rw-r--r-- 1 root root 4096 12月 10 23:01 rotational
-rw-r--r-- 1 root root 4096 12月 10 23:01 rq_affinity
-rw-r--r-- 1 root root 4096 12月 10 23:27 scheduler
-rw-r--r-- 1 root root 4096 12月 10 23:01 unpriv_sgio
-r--r--r-- 1 root root 4096 12月 10 23:01 write_same_max_bytes

add_random
一些I/O時間會影響 /dev/random的熵池,如果這些影響的負荷變得可測量,該參數(shù)可設置為0


max_sectors_kb

指定I//O請求的最大尺寸(以千字節(jié)計算),默認值為512kb,該參數(shù)的最小值是由存儲設備的邏輯塊大小決定的,該參數(shù)的最大值是由max_hw_sectors_kb值決定的。

I/O請求大于內(nèi)部存儲塊大小時,一些固態(tài)硬盤會表現(xiàn)不佳,這種情況下,redhat推薦將max_hw_sectors_k減少至內(nèi)部存儲塊大小


nomerges

大多數(shù)工作負載受益于請求合并,然而,禁用合并有助于調(diào)試目的,可設置參數(shù)為0禁用合并,默認設置下為啟用(設置為1)。


?nr_requests
限定同一時間排隊的讀和寫請求的最大數(shù)量。默認值為 128, 即在請求讀或者寫操作的下一個進程進入睡眠模式前有 128 個讀請求和 128 個寫請求排隊。對于延遲敏感應用程序,降低該參數(shù)值,并限制存儲上的命令隊列深度,這樣回寫 I/O 便無法填充有寫請求的設備隊列。設備隊列填充時,其他嘗試執(zhí)行 I/O 操作的進程會進入睡眠模式,直到有可用隊列空間。隨后請求會以 round-robin fashion(循環(huán)方式)分配,以防止一個進程持續(xù)使用隊列所有點。


optimal_io_siz e
一些存儲設備用此參數(shù)報告最佳 I/O 大小。如果報告該值,紅帽建議您盡可能將應用程序發(fā)出 I/O與最佳 I/O 大小對齊,并是最佳 I/O 大小的倍數(shù)。


?read_ahead_kb
定義操作系統(tǒng)在順序讀取操作階段將預先讀取的千字節(jié)數(shù)量,以便存儲在頁面緩存中可能馬上需要的信息。設備映射程序經(jīng)常受益于高read_ahead_kb 值 128 KB ;對于訪問將要被映射的設備這是一個良好起點。


旋轉(zhuǎn)
一些固態(tài)硬盤不能正確公布其固態(tài)硬盤狀態(tài),并且會如傳統(tǒng)旋轉(zhuǎn)磁盤載。如果您的固態(tài)硬盤不能將它自動設置它為 0,那么請您手動設置,禁用調(diào)度器上不必要的搜尋減少邏輯。


?rq_affinity
默認設置下,I/O 完成能在不同處理器上進行,而不是限定在發(fā)出 I/O 請求的處理器上。將rq_affinity 設置為 1 以禁用此能力,并只在發(fā)出 I/O 請求的處理器上執(zhí)行完成。這能提高處理器數(shù)據(jù)緩存的有效性

7 為性能配置文件系統(tǒng)

如果文件碎片或者資源爭用引起性能損失,性能通??赏ㄟ^重新配置文件系統(tǒng)而提高性能。然而,在有些用例中,可能需要更改應用程序。

1 調(diào)整XFS

XFS 默認格式化和掛載設置適用于大多數(shù)工作負載。紅帽建議只在更改特定配置會對您的工作負載有益時對它們進行更改。

1 格式化選項參數(shù)

目錄塊大小

目錄塊大小影響每個 I/O 操可檢索或修改的目錄信息數(shù)量。目錄塊大小最小值即文件系統(tǒng)塊大小、(默認設置下為4 KB)。目錄塊大小最大值為 64 KB。

對于指定的目錄塊大小來說,大的目錄比小的目錄需要更多 I/O。因為和小目錄塊的系統(tǒng)相比,大目錄塊大小的系統(tǒng)每 I/O 操作會使用更多的處理能力。因此,根據(jù)您的工作負載,推薦使用盡可能小的目錄和目錄塊大小。
如文件系統(tǒng)比大量寫和大量讀工作負載的列出項目數(shù)量少,紅帽推薦使用以下目錄塊大小,請見如下

〈表 5.1 “為目錄塊大小推薦的最大目錄項” 〉

目錄塊大小 最大項 (大量讀操作) 最大項 (大量寫操作)
4 KB             100000–200000 1000000–2000000
16 KB           100000–1000000 1000000–10000000
64 KB >        1000000 >10000000

在不同大小文件系統(tǒng)中,目錄塊大小對讀和寫工作負載的影響的情況請參見 XFS 文件。


分配組

分配組是獨立的結(jié)構(gòu),指示自由空間并在文件系統(tǒng)中一節(jié)分配 inodes。只要同時操作影響不同分配組,每個分配組能被獨立修改,這樣 XFS 同時執(zhí)行分配和解除分配操作。因此文件系統(tǒng)中執(zhí)行的同時操作數(shù)量和分配組數(shù)量相等。然而,由于執(zhí)行同時操作的能力受到能夠執(zhí)行操作的處理器數(shù)量的限制,紅帽建議分配組數(shù)量應多于或者等于系統(tǒng)中處理器的數(shù)量。
多個分配組無法同時修改單獨目錄。因此,紅帽推薦大量創(chuàng)建和移除文件的應用程序不要在單個目錄中存儲所有文件。


增長約束

如果在格式化之后,需要增加文件系統(tǒng)的大小,由于分配組大小在完成格式化之后不能更改,需要考慮布局必須根據(jù)文件系統(tǒng)的最終能力,而非根據(jù)初始化能力調(diào)節(jié)分配組大小,占據(jù)所有使用空間的文件系統(tǒng)中分配組數(shù)量不應超過數(shù)百,除非分配組處于最大尺寸(1TB),因此,紅帽想大部分文件系統(tǒng)推薦最大增長,允許文件系統(tǒng)是初始大小的十倍。

增長RAID數(shù)組的文件系統(tǒng)時,務必考慮額外護理,由于設備大小必須與固定多個分配組大小對齊,以便新分配組表頭在新增加的存儲中正確對齊,由于幾何在格式化之后不能被修改,因此新存儲也必須與已有存儲幾何一致,因此,在同一塊設備上,不能優(yōu)化不同幾何的存儲。


iNode 大小和內(nèi)聯(lián)屬性

如果iNode有足夠可用空間,XFS能直接將屬性名稱和值寫入inode,由于不需要額外的I/O,這些內(nèi)聯(lián)屬性能夠被獲取和修改,達到比獲取單獨的屬性塊更快的量級。

默認 inode 大小為 256 bytes。其中只有約 100 bytes 大小可用于屬性存儲,取決于 inode 上存儲的數(shù)據(jù)范圍指針數(shù)量。格式化文件系統(tǒng)時,增加 inode 大小能增加存儲屬性可用的空間數(shù)量。

屬性名稱和屬性值兩者都受到最大尺寸 254 bytes 的限制。如果名稱或者值超過 254 bytes 長度,該屬性會被推送到單獨的屬性快,而非存儲在內(nèi)聯(lián)中。


RAID

如果使用軟件 RAID ,mkfs.xfs 會使用合適的帶狀單元和寬度自動配置底層的硬件。然而,如果使用硬件 RAID, 帶狀單元和寬度可能需要手動配置,這是因為不是所有硬件 RAID 設備輸出此信息。使用 mkfs.xfs -d 選項配置帶狀單元和寬度。更多信息請參見 mkfs.xfs 手冊頁。


日志大小
直到同步事件被觸發(fā),待定的更改在內(nèi)存中累計,這個時候它們會被寫入日志。日志大小決定同時于進行中的修改數(shù)量。它也決定在內(nèi)存中能夠累計的最大更改數(shù)量,因此決定記錄的數(shù)據(jù)寫入磁盤的頻率。與大日志相比,小日志促使數(shù)據(jù)更頻繁地回寫入磁盤。然而,大日志使用更多內(nèi)存來記錄待定的修改,因此有限定內(nèi)存的系統(tǒng)將不會從大日志獲益。
日志與底層帶狀單元對齊時,日志表現(xiàn)更佳;換言之,它們起止于帶狀單元邊界。使用 mkfs.xfs -d 選項將日志對齊帶狀單元,更多信息請參見 mkfs.xfs 手冊頁。
使用下列 mkfs.xfs 選項配置日志大小,用日志大小替換 logsize :

# mkfs.xfs -l size=logsize

更多詳細信息參見 mkfs.xfs 手冊頁:

$ man mkfs.xfs

日志帶狀單元
日志寫操作起止于帶狀邊界時(與底層帶狀單元對齊),存儲設備上使用 RAID5 或 RAID6 布局的日志寫操作可能會表現(xiàn)更佳。mkfs.xfs 嘗試自動設置合適的日志帶狀單元,但這取決于輸出該信息的 RAID 設備。如果您的工作負載過于頻繁地觸發(fā)同步事件,設置大日志帶狀單元會降低性能。這是因為小的寫操作需要填充至日志帶狀單元,而這會增加延遲。如果您的工作負載受到日志寫操作延遲的約束,紅帽推薦將日志帶狀單元設置為 1 個塊,從而盡可能地觸發(fā)非對齊日志寫操作。支持的最大日志帶狀單元為最大日志緩存的大?。?56 KB)。因此底層存儲器可能擁更大的帶狀單元,且該帶狀單元能在日志中配置。在這種情況下,mkfs.xfs 會發(fā)出警告,并設置一個大小為32 KB 的日志帶狀單元。使用以下選項之一配置日志帶狀單元,其中 N 是被用于帶狀單元的塊的數(shù)量,size 是以 KB 為單位的帶狀單元的大小。

mkfs.xfs -l sunit=Nb
mkfs.xfs -l su=size

更多詳細信息參見 mkfs.xfs 手冊頁:

$ man mkfs.xfs
2 掛載選項

iNode 分配

建議文件系統(tǒng)大于1TB,iNode64參數(shù)配置XFS,從而在文件系統(tǒng)中分配iNode和數(shù)據(jù),這樣能保證iNode不會被大量分配到文件系統(tǒng)的起始位置,數(shù)據(jù)也不會被大量分配到文件系統(tǒng)的結(jié)束位置,從而提高大文件系統(tǒng)的性能表現(xiàn)。


日志緩存和數(shù)量

日志緩存越大,將所有變更寫入日志的I/O操作越少,大日志緩存能提高有大量I/O密集型總負載的系統(tǒng)表現(xiàn),該工作負載沒有非易變的寫緩存。

通過 logbsize 掛載選項配置日志緩存大小,并確定日志緩存中信息存儲的最大數(shù)量。如果未設置日志帶狀單元,緩存寫操作可小于最大值,因此不需要減少大量同步工作負載中的日志緩存大小。

默認的日志緩存大小為 32 KB。最大值為 256 KB, 也支持 64 KB、128 KB 或以 2 的倍數(shù)為冪的介于 32 KB 和 256 KB 之間的日志帶狀單元。

日志緩存的數(shù)量是由 logbufs 掛載選項確定的。日志緩存的默認值為 8 (最大值),但能配置的日志緩存最小值為2。通常不需要減少日志緩存的數(shù)量,除非內(nèi)存受限的系統(tǒng)不能為額外的日志緩存分配內(nèi)存。減少日志緩存的數(shù)量會降低日志的性能,尤其在工作負載對 I/O 延遲敏感的時候。


延?延遲變更日志

內(nèi)存的變更寫入日志前,XFS 的選項能集成這些改變。 delaylog 參數(shù)允許將頻繁更改的元數(shù)據(jù)周期性地寫入日志,而非每次改變都要記錄到日志中。此選項會增加故障中操作丟失的潛在數(shù)量,也會增加用于跟蹤元數(shù)據(jù)的內(nèi)存大小。但是,它能通過按量級排序增加元數(shù)據(jù)的更改速度和可擴展性,為確保數(shù)據(jù)和元數(shù)據(jù)寫入硬盤而使用 fsync、fdatasync 或sync 時,此選項不能減少數(shù)據(jù)或元數(shù)據(jù)的完整性。

2 調(diào)整 ext4

1 格式化選項

iNode 表初始化

在很大的文件系統(tǒng)上初始化文件系統(tǒng)中的所有iNode會耗時很久,默認設置下回推遲初始化過程(啟用遲緩iNode表初始化),但是,如果沒ext4驅(qū)動,默認設置下回禁用遲緩iNode表初始化,可通過設置lazy_itable_init為1啟用,那么在掛載后,內(nèi)核進程繼續(xù)初始化文件系統(tǒng)

2 掛載選項

inode 表初始化率
啟用遲緩 inode 表初始化時,您可通過指定 init_itable 參數(shù)值控制初始化發(fā)生的速率。執(zhí)行后臺初始化的時間約等于 1 除以該參數(shù)值。默認值為 10。


自?自動文件同步
對現(xiàn)有文件重命名、截斷或重寫后,一些應用程序無法正確執(zhí)行 fsync。默認設置下,執(zhí)行這些操作之后,ext4 會自動同步文件。但這樣會比較耗時。
如果不需要此級別的同步,您可在掛載時通過指定 noauto_da_alloc 選項禁用該行為。如果noauto_da_alloc 已設置,應用程序必須明確使用 fsync 以確保數(shù)據(jù)的持久化。


日志 I/O 優(yōu)先級

默認設置下日志 I/O 優(yōu)先級為 3,該值比常規(guī) I/O 的優(yōu)先級略高。您可在掛載時使用
journal_ioprio 參數(shù)控制日志 I/O 的優(yōu)先級。journal_ioprio 的有效值范圍為從 0 到 7,
其中 0 表示具有最高優(yōu)先級的 I/O。

3 調(diào)整 btrfs

自紅帽企業(yè)版 Linux 7.0 起,btrfs 作為技術預覽而為用戶提供。如果 btrfs 受到全面支持,本章節(jié)將在未來更新。
調(diào)整 GFS2
本章節(jié)涵蓋 GFS2 文件系統(tǒng)在格式化和掛載時可用的調(diào)整參數(shù)。
目?目錄間距GFS2 掛載點的頂層目錄中創(chuàng)建的所有目錄都是自動間隔,以減少目錄中的碎片并提高寫速度。為像頂層目錄間隔其他目錄,用 T 屬性標注該目錄,如示,用您想間隔該目錄的路徑替代 dirname。

# chattr +T dirname

chattr 作為 e2fsprogs 軟件包中的一部份為用戶提供。
減?減少爭用GFS2 使用全域鎖機制,該機制需要簇中節(jié)點之間的通信。多節(jié)點之間的文件和目錄爭用會降低性能。通過最小化多節(jié)點間共享的文件系統(tǒng)區(qū)域,您可將緩存失效的風險最小化.

4 網(wǎng)絡

網(wǎng)絡子系統(tǒng)由很多敏感連接的不同部分構(gòu)成。紅帽企業(yè)版 Linux 7 網(wǎng)絡因此旨在為大多數(shù)工作負載提供最佳性能,并且自動優(yōu)化其性能。因此,不需要時常手動調(diào)節(jié)網(wǎng)絡性能。本章探討了可以對功能網(wǎng)絡系統(tǒng)做的進一步優(yōu)化。

1 注意事項

若需要調(diào)優(yōu),用戶需要對redhat 企業(yè)版Linux網(wǎng)絡包的接受有充分認識,

2 基本原理

1 網(wǎng)絡收包處理基本原理

發(fā)送至redhatLinux 系統(tǒng)的數(shù)據(jù)包是由 NIC(網(wǎng)絡接口卡)接受的,數(shù)據(jù)包置于內(nèi)核硬件緩沖或者是循環(huán)緩沖區(qū)中,NIC之后會發(fā)送一個硬件終端請求,促使生成一個軟件中斷操作來處理該中斷請求,作為軟件中斷操作的一部分,數(shù)據(jù)包會由緩沖區(qū)轉(zhuǎn)移到網(wǎng)絡堆棧,根據(jù)數(shù)據(jù)包及用戶的網(wǎng)絡配置,數(shù)據(jù)包之后會被轉(zhuǎn)發(fā),刪除或者轉(zhuǎn)移到一個應用程序的socket接受隊列,并將從網(wǎng)絡堆棧中刪除,這一進程會持續(xù)進行,直到NIC硬件緩沖區(qū)中沒有數(shù)據(jù)包或者一定數(shù)量的數(shù)據(jù)包(在 /proc/sys/net/core/dev_weight 中指定)被轉(zhuǎn)移。

2 網(wǎng)絡性能影響因素

網(wǎng)絡性能問題最常見的是由硬件故障或者基礎結(jié)構(gòu)層故障造成的

數(shù)據(jù)包接受瓶頸

雖然網(wǎng)絡堆?;旧鲜亲晕覂?yōu)化的,但是在網(wǎng)絡堆棧處理過程中后很多呆滯瓶頸且降低性能的問題


NIC 硬件緩沖區(qū)或循環(huán)緩沖區(qū)
如果大量數(shù)據(jù)包被棄置,硬件緩沖區(qū)就會成為瓶頸,要監(jiān)控系統(tǒng)傳動的數(shù)據(jù)包,需要使用ethool

硬件或軟件中斷隊列

中斷會增加延遲,爭用處理器。


應用程序的socket接收隊列
應用是程序接收隊列的瓶頸是大量的數(shù)據(jù)包沒有復制到請求的應用程序中,或者是UDP輸入錯誤增加,此錯誤在/proc/net/snmp中。

3 監(jiān)控和診斷性能問題

1 ss

ss 是一個命令行實用程序,顯示關于 socket的數(shù)據(jù)信息,允許管理員隨時評估設備性能。ss 列表會默認打開沒有注意到但已建立了連接的 TCP socket,但是會提供大量有用的選項來給管理員篩選特定的 socket數(shù)據(jù)。

紅帽推薦在紅帽企業(yè)版 Linux 7 中使用 ss 來替代 netstat。

2 ip

ip 實用程序允許管理員管理和監(jiān)控線路、設備、路由策略及通道。ip monitor 指令可以持續(xù)監(jiān)控設備、地址和線路的狀況。

3 dropwatch

Dropwatch 是一個交互工具,用來監(jiān)控和記錄內(nèi)核棄置的數(shù)據(jù)包。

4 ethtool

ethtool 實用程序允許管理員查看和編輯網(wǎng)絡接口卡的設置。它有助于觀察特定設備的數(shù)據(jù),例如該設備棄
置的數(shù)據(jù)包數(shù)量。
用戶可以使用 ethtool -S 查看特定設備的計數(shù)狀態(tài)和想要監(jiān)控的設備名稱。

ethtool -S devname

5 /proc/net/snmp

/proc/net/snmp 文件顯示的數(shù)據(jù)是snmp用來監(jiān)控和管理IP,ICMP,TCP和UDP的,定期檢查此文件可以協(xié)助管理員識別異常值,從而識別潛在的性能問題,如 UDP輸入錯誤(InErrors)增加,且錯誤在/proc/net/snmp中,就意味著socket接收隊列中出現(xiàn)了瓶頸。

[root@centos8 ~]# cat /proc/net/snmp
Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates
Ip: 1 64 837779 0 0 0 0 0 837749 711025 0 2 0 60 30 0 0 0 0
Icmp: InMsgs InErrors InCsumErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps
Icmp: 28091 13028 0 28088 0 0 0 0 3 0 0 0 0 0 28125 0 28122 0 0 0 0 0 3 0 0 0 0
IcmpMsg: InType3 InType8 OutType0 OutType3
IcmpMsg: 28088 3 3 28122
Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts InCsumErrors
Tcp: 1 200 120000 -1 15481 26 14418 25 4 793658 977256 12557 1 94 0
Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti
Udp: 7245 34 0 884 0 0 0 8577
UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti
UdpLite: 0 0 0 0 0 0 0 0

4 配置工具

1 網(wǎng)絡性能tuned-adm配置文件

tuned-adm 對很多特定用例提供不同配置文件以提高性能
延遲性能
網(wǎng)絡延遲
網(wǎng)絡吞吐量

2 配置硬件緩沖區(qū)

如果硬件緩沖區(qū)棄置了大量的數(shù)據(jù)包,那么有很多可能的解決方法。


減緩輸入流量

篩選傳入的流量,減少加入的多播組數(shù)量或減少廣播流量,以降低隊列填充率。


調(diào)整硬件緩沖隊列

通過增加隊列的大小以減少傳動的數(shù)據(jù)包數(shù)量,使其不易過剩,用戶可以使用ethtool 指令來更改網(wǎng)絡設備的rx/tx參數(shù)

ethtool --set-ring devname value

改變隊列的排除率

設備重量是指設備一次可以接收的數(shù)據(jù)包數(shù)量(單個預定處理器訪問)。用戶可以通過提高設備重量以增加隊列的排出比率,這由dev_weight 參數(shù)控制。此參數(shù)可以通過變/proc/sys/net/core/dev_weight 文件的內(nèi)容來做臨時更改,或使用 sysctl 進行永久更改,這由 procps-ng 數(shù)據(jù)包提供。

改變隊列排出率通常是緩解不良網(wǎng)絡性能最簡單的方法。但是,增加設備一次可以接收的數(shù)據(jù)包數(shù)量會消耗處理器額外的時間,在此期間不可調(diào)度其他進程,因此可能會導致其他性能問題。

3 配置中斷隊列

如果分析顯示高延遲,系統(tǒng)可能受益于基于輪詢的包接收,而不是基于中斷的包接收。

1 配置繁忙輪訓

繁忙輪詢有助于減少網(wǎng)絡接收路徑中的延遲, 使 socket 層代碼查詢網(wǎng)絡設備的接收隊列并禁用網(wǎng)絡中斷,這可以消除由于中斷和由此產(chǎn)生的環(huán)境切換所造成的延誤。但是,它會增加 CPU 的使用率。繁忙輪詢可以防止CPU 進入睡眠狀態(tài),睡眠狀態(tài)會造成額外的功耗。


繁忙輪詢是默認禁用的。要在特定 socket 中啟用繁忙輪詢,請按以下指示:

將 sysctl.net.core.busy_poll 設置為除 0 以外的值。這一參數(shù)控制的是 socket 輪詢和選擇位于等待設備隊列中數(shù)據(jù)包的微秒數(shù)。紅帽推薦值為 50。


添加 SO_BUSY_POLL socket 選項至 socket。

要全局啟用繁忙輪詢, 須將 sysctl.net.core.busy_read 設置為除了 0 以外的值。這一參數(shù)控制了socket 讀取位于等待設備隊列中數(shù)據(jù)包的微秒數(shù),且設置了 SO_BUSY_POLL 選項的默認值。紅帽推薦在socket 數(shù)量少時將值設置為 50 , socket 數(shù)量多時將值設置為 100。對于 socket 數(shù)量極大時(超過幾百),請使用 epoll。


繁忙輪詢由以下驅(qū)動程序支持。紅帽企業(yè)版 Linux 7 支持這些驅(qū)動程序。
bnx2x
be2net
ixgbe
mlx4
myri10ge

4 配置socket接收隊列

如果分析數(shù)據(jù)顯示,數(shù)據(jù)包由于 socket 隊列排出率太慢而被棄置,有幾種方法來解決由此產(chǎn)生的性能問題。


?減少傳入流量的速度

減少隊列填充速率可以通過篩選或棄置進入隊列前的數(shù)據(jù)包,或是減少設備重量。

設備重量是指設備一次可以接收的數(shù)據(jù)包數(shù)量,設備重量由dev_weight參數(shù)控制,此參數(shù)可以通過改變/proc/sys/net/core/dev_weight 文件的內(nèi)容來做臨時更改,或者是使用sysctl 來做永久更改

[root@centos8 ~]# cat /proc/sys/net/core/dev_weight
64

增加隊列深度

增加應用程序的 socket 隊列深度往往是提高 socket 隊列排出率最簡單的方法,但不可能是一個長期的解決方法。


要增加隊列深度就要增加 socket 接收緩沖區(qū)的大小,可以做如下變化:

增加 /proc/sys/net/core/rmem_default 值
這一參數(shù)控制 socket 使用的接收緩沖區(qū)的默認大小,這個值必須小于
/proc/sys/net/core/rmem_max 的值。


使用 setsockopt 配置較大的 SO_RCVBUF 值
這一參數(shù)控制的是以字節(jié)為單位的 socket 接收緩沖區(qū)的最大值。使用 getsockopt 系統(tǒng)調(diào)用來確
定當前緩沖區(qū)的值。

5 配置 RSS

RSS(接收端調(diào)整),也叫做多隊列接受,是通過一些基于硬件的接受隊列來分配網(wǎng)絡接受進程,從而使得入站網(wǎng)絡流量可以由多個CPU進行處理,RSS可以用來緩解接受中斷進程中由單個CPU過載而出現(xiàn)的瓶頸,并減少網(wǎng)絡延遲。


要確定您的網(wǎng)絡接口卡是否支持 RSS,須查看多個中斷請求隊列是否在 /proc/interrupts 中有相關的接口。例如,如果用戶對 p1p1 接口有興趣:

# egrep 'CPU|p1p1' /proc/interrupts

CPU0 CPU1 CPU2 CPU3 CPU4 CPU5
89: 40187 0 0 0 0 0 IR-PCI-MSI-edge
p1p1-0
90: 0 790 0 0 0 0 IR-PCI-MSI-edge
p1p1-1
91: 0 0 959 0 0 0 IR-PCI-MSI-edge
p1p1-2
92: 0 0 0 3310 0 0 IR-PCI-MSI-edge
p1p1-3
93: 0 0 0 0 622 0 IR-PCI-MSI-edge
p1p1-4
94: 0 0 0 0 0 2475 IR-PCI-MSI-edge
p1p1-5

前的輸出顯示 NIC 驅(qū)動程序為 p1p1 接口創(chuàng)建了 6 個接收隊列(p1p1-0 至 p1p1-5)。也顯示出每個隊列處理的中斷數(shù)量以及處理中斷的 CPU。在這種情況下,由于有 6 個默認隊列,這一特殊的 NIC 驅(qū)動程序就為每個 CPU 創(chuàng)建一個隊列,這個系統(tǒng)一共有 6 個 CPU。這是 NIC 驅(qū)動程序中很常見的模式?;蛘哂脩艨梢栽诰W(wǎng)絡驅(qū)動程序加載后查看 ls -1/sys/devices///device_pci_address/msi_irqs 的輸出。


例如,如果用戶對 PCI 地址為0000:01:00.0 的設備感興趣,可以通過以下指令來列出該設備中斷請求隊列:

ls -1 /sys/devices///0000:01:00.0/msi_irqs
101
102
103
104
105
106
107
108
109


RSS 是默認啟用的。RSS 的隊列數(shù)(或是需要運行網(wǎng)絡活動的 CPU )會由適當?shù)木W(wǎng)絡驅(qū)動程序來進行配置。 bnx2x 驅(qū)動程序是在 num_queues 中進行配置。sfc 驅(qū)動程序是用 rss_cpus 參數(shù)進行配置。通常,這都是在 /sys/class/net/device/queues/rx-queue/ 中進行配置,其中 device 是網(wǎng)絡設備的名稱(比如 eth2),rx-queue 是適當?shù)慕邮贞犃忻Q。


配置 RSS 時,紅帽推薦限制每一個物理 CPU 內(nèi)核的隊列數(shù)量。超線程在分析工具中通常代表獨立的內(nèi)核,但是所有內(nèi)核的配置隊列,包括如超線程這樣的邏輯內(nèi)核尚未被證實對網(wǎng)絡性能有益。

啟用時,基于每個隊列的 CPU 進程數(shù)量,RSS 在 CPU 間平等地分配網(wǎng)絡進程。但是,用戶可以使用
ethtool --show-rxfh-indir 和 --set-rxfh-indir 參數(shù)來更改網(wǎng)絡活動的分配方式,并權(quán)衡哪種類型的網(wǎng)絡活動更為重要。


irqbalance 后臺程序可與 RSS 相結(jié)合,以減少跨節(jié)點內(nèi)存及高速緩存行反彈的可能性。這降低了處理網(wǎng)絡數(shù)據(jù)包的延遲。

6 配置 RPS

RPS(接收端包控制)與 RSS類似,用于將數(shù)據(jù)包指派至特定的 CPU 進行處理。但是,RPS 是在軟件級別上執(zhí)行的,這有助于防止單個網(wǎng)絡接口卡的軟件隊列成為網(wǎng)絡流量中的瓶頸。


較之于基于硬件的 RSS ,RPS 有幾個優(yōu)點:

RPS 可以用于任何網(wǎng)絡接口卡。


易于添加軟件過濾器至 RPS 來處理新的協(xié)議。


RPS 不會增加網(wǎng)絡設備的硬件中斷率。但是會引起內(nèi)處理器間的中斷。


每個網(wǎng)絡設備和接收隊列都要配置 RPS,在/sys/class/net/device/queues/rxqueue/rps_cpus 文件中,device 是網(wǎng)絡設備的名稱(比如 eth0),rx-queue 是適當?shù)慕邮贞犃忻Q(例如 rx-0)。


rps_cpus 文件的默認值為 0。這會禁用 RPS,以便處理網(wǎng)絡中斷的 CPU 也能處理數(shù)據(jù)包。


要啟用 RPS,配置適當?shù)?rps_cpus 文件以及特定網(wǎng)絡設備和接收隊列中須處理數(shù)據(jù)包的 CPU 。


rps_cpus 文件使用以逗號隔開的 CPU 位圖。因此,要讓 CPU 在一個接口為接收隊列處理中斷,請將它們在位圖里的位置值設為 1。例如,用 CPU 0、1、2 和 3 處理中斷,將 rps_cpus 的值設為 00001111
(1+2+4+8),或 f(十六進制的值為 15)。


對于單一傳輸隊列的網(wǎng)絡設備,配置 RPS 以在同一內(nèi)存區(qū)使用 CPU 可獲得最佳性能。在非 NUMA 的系統(tǒng)中,這意味著可以使用所有空閑的 CPU。如果網(wǎng)絡中斷率極高,排除處理網(wǎng)絡中斷的 CPU 也可以提高性能。


對于多隊列的網(wǎng)絡設備,配置 RPS 和 RSS 通常都不會有好處,因為 RSS 配置是默認將 CPU 映射至每個接收隊列。但是,如果硬件隊列比 CPU 少,RPS依然有用,并且配置 RPS 是來在同一內(nèi)存區(qū)使用 CPU。

7 配置 RFS

RFS(接收端流控制) 擴展了RPS 的性能以增加CPU緩存命中率,以此減少網(wǎng)絡延遲,RPS僅基于隊列長度RFS 使用 RPS 后端預測最合適的 CPU,之后會根據(jù)應用程序處理數(shù)據(jù)的位置來轉(zhuǎn)發(fā)數(shù)據(jù)包。這增加了 CPU 的緩存效率。


RFS 是默認禁用的。要啟用 RFS,用戶須編輯兩個文件:

?/proc/sys/net/core/rps_sock_flow_entries
設置此文件至同時活躍連接數(shù)的最大預期值。對于中等服務器負載,推薦值為 32768 。所有輸入的值四舍五入至最接近的2的冪。

?/sys/class/net/device/queues/rx-queue/rps_flow_cnt
將 device 改為想要配置的網(wǎng)絡設備名稱(例如,eth0),將 rx-queue 改為想要配置的接收隊列名稱(例如,rx-0)。
將此文件的值設為 rps_sock_flow_entries 除以 N,其中 N
是設備中接收隊列的數(shù)量。例如,如果 rps_flow_entries 設為 32768,并且有 16 個配置接收隊列,那么rps_flow_cnt 就應設為 2048。對于單一隊列的設備,rps_flow_cnt 的值和rps_sock_flow_entries 的值是一樣的。


從單個發(fā)送程序接收的數(shù)據(jù)不會發(fā)送至多個 CPU。如果從單個發(fā)送程序接收的數(shù)據(jù)多過單個 CPU 可以處理的數(shù)量,須配置更大的幀數(shù)以減少中斷數(shù)量,并以此減少 CPU 的處理工作量。或是考慮 NIC 卸載選項來獲得更快的 CPU。


考慮使用 numactl 或 taskset 與 RFS 相結(jié)合,以將應用程序固定至特定的內(nèi)核、 socket 或 NUMA 節(jié)點。這可以有助于防止數(shù)據(jù)處理紊亂。

8 配置加速 RFS

加速 RFS 是通過添加硬件協(xié)助來增速的。如同 RFS,數(shù)據(jù)轉(zhuǎn)發(fā)是基于應用程序處理數(shù)據(jù)包的位置。但不同于傳統(tǒng) RFS 的是,數(shù)據(jù)是直接發(fā)送至處理數(shù)據(jù)線程的本地 CPU:即運行應用程序的 CPU,或是對于在緩存層次結(jié)構(gòu)中的 CPU 來說的一個本地 CPU。


加速 RFS 只有滿足以下條件才可以使用:
網(wǎng)絡接口卡須支持加速 RFS。加速 RFS 是由輸出 ndo_rx_flow_steer() netdevice 功能的接口卡支持。
ntuple 篩選必須啟用。


一旦滿足了這些條件,隊列映射 CPU 就會基于傳統(tǒng) RFS 配置自動導出。即隊列映射 CPU 會基于由每個接收隊列的驅(qū)動程序配置的 IRQ 關聯(lián)而自動導出。從 <第 6.3.7 節(jié) “配置 RFS”> 中來獲取配置傳統(tǒng) RFS 的信息,紅帽推薦在可以使用 RFS 以及網(wǎng)絡接口卡支持硬件加速時使用加速 RFS。

5 其他網(wǎng)絡調(diào)優(yōu)參數(shù)

net.ipv4.tcp_max_tw_buckets
Timewait 的數(shù)量,默認為8192


net.ipv4.ip_local_port_range= 1024 65000
允許系統(tǒng)打開的端口范圍,前面為下線,后面為上線。默認是 32768 61000
注意: 此可用范圍決定了最后timewait狀態(tài)的鏈接數(shù)量:下面兩個選項可有效降低 tw狀態(tài)鏈接數(shù)量


net.ipv4.tcp_tw_recycle={0|1}
是否啟用timeout快速回收:注意: 開啟此功能在nat環(huán)境下可能會出現(xiàn)嚴重問題,因為TCP有一種行為,他可以緩沖每個鏈接最新的時間戳,后續(xù)請求如果時間小于緩沖中的時間戳,即被視為無效并丟棄相應的請求報文,Linux是否啟用這種行為取決于tcp_timestamp 和 tcp_tw_recycle ,而前一個參數(shù)默認是啟動的,所以啟用后面的參數(shù)就會激活此功能,
如果是NAT,為了安全起見,應該禁用tcp_tw_recycle, 另一種解決方案:把tcp_timestamps設置為0.tcp_tw_recycle 設置為1 并不會生效,


net.ipv4.tcp_tw_reuse={0|1}
是否開啟tw 重用,即是否允許將time_wait sockets 用于新的TCP 鏈接


net.ipv4.tcp_sycncookies={0|1}
是否開啟SYN cookies , 及當SYN 等待隊列溢出時,是夠啟用cookies 功能 (是否能夠盡可能容納能多請求)


net.ipv4.tcp_timestapms=0
tcp報文時間錯,關閉可以避免序列號的卷繞 (防止繞一圈回來的問題)


net.ipv4.tcp_max_syn_backlog= 262144
保存的那些尚未收到客戶端確認信息的鏈接請求的最大值,默認為128,可增大


net.ipv4.tcp_synack_retries= # 表示在服務器端如果沒有收到客戶端相應時發(fā)送數(shù)據(jù)的次數(shù)
為了打開對端鏈接,內(nèi)核需要發(fā)送一個SYN并附帶一個回應前面的一個SYN的ACK, 這業(yè)績所有的三次握手中的第二次,這個設置決定了內(nèi)核放棄鏈接之前發(fā)送SYN+ACK 包的數(shù)量,繁忙的服務器上建議設置為0或者1;


net.ipv4.tcp_syn_Retries=2622144
表示服務器主動發(fā)送TCP 鏈接的次數(shù)
在內(nèi)核中放棄建立連接之前發(fā)送SYN包的數(shù)量,繁忙的服務器上建議設置為0或者1


net.ipv4.tcp_max_orphans=2622144

系統(tǒng)中最多有多少個TCP套接字不被關聯(lián)到任何一個用戶文件句柄上,如果超過這個數(shù)字,連接將即可被復位毛病發(fā)音出警告信息,這個限制僅僅是為了防止簡單的Dos,不能過分依賴人文減少這個值,如果需要修改,在確保有足夠內(nèi)存可能的前提下,應該增大此值。


net.ipv4.tcp_fin_timeout=5

如果套接字由本端要求關閉,這個參數(shù)決定了我他保持FIN_WAIT-2狀態(tài)的時間,缺省值是60秒

然而,對端可能會出錯或者意外宕機永遠不會關閉鏈接,及時是一個輕量級的web,也可能會有大量的四套接字而內(nèi)存溢出的風險,fin-wait-2 的危險性比fin-wait-1 要小,因為每個鏈接最多只能消耗1.5K內(nèi)存,但是他們的生存期長一些。


net.ipv4.tcp_keepalive_time=30
當keepalive啟動的時候,TCP 發(fā)送keepalive消息的頻度,默認是2小時


以 core 開頭的主要用于定義非TCP 相關的緩沖單位是字節(jié)
net.core.rmem_max=8388608
定義內(nèi)核用于所有類型的鏈接的最大接受緩沖大小


net.core.rmem_Default=65536
定義內(nèi)核所有類型的鏈接的默認接受緩沖大小


net.core.wmem_max=8338608
定義內(nèi)核用于所有類型的鏈接的最大發(fā)送緩沖大小


net.core.wmem_default=65536
定義內(nèi)核用于所有類型的鏈接的默認發(fā)送緩沖大小


net.ipv4.tcp_mem='8388608 8388608 8388608 '

定義TCP 協(xié)議棧使用的內(nèi)存空間,分別為最小值,默認值和最大值


net.ipv4.tcp_rmem='4096 37380 8388608
定義TCP 協(xié)議棧中用于接受緩沖的內(nèi)存空間,第一個是最小值,即便當前主機內(nèi)存空間吃緊,也得保證TCO協(xié)議棧至少有次大小的空能空間,第二個值為默認值,他會覆蓋net.core.rmem_Default 中為所有協(xié)議定義的接受緩沖的大小,第三個值為最大值,既能用于TCP接受緩沖的最大內(nèi)存空間


net.ipv4.tcp_wmem='4096 65535 8388608'
定義TCP協(xié)議棧用于發(fā)送緩沖區(qū)的內(nèi)存空間

5 相關工具詳解

1 irqbalance

是一個命令行工具,在處理器中分配硬件中斷以提高系統(tǒng)性能,默認設置下再后臺程序運行,但只能通過 --oneshot 選項運行一次


以下參數(shù)可用于提高性能

--powerthresh
CPU 進入節(jié)能模式之前,設定可空閑的 CPU 數(shù)量。如果有大于閥值數(shù)的 CPU 是大于一個標準的偏差,該差值低于平均軟中斷工作負載,以及沒有 CPU 是大于一個標準偏差,且該偏差高出平均,并有多于一個的 irq 分配給它們,一個 CPU 將處于節(jié)能模式。在節(jié)能模式中,CPU 不是irqbalance 的一部分,所以它在有必要時才會被喚醒。


--hintpolicy
決定如何解決 irq 內(nèi)核關聯(lián)提示。有效值為 exact(總是應用 irq 關聯(lián)提示)、subset (irq 是平衡的,但分配的對象是關聯(lián)提示的子集)、或者 ignore(irq 完全被忽略)。


--policyscript
通過設備路徑、當作參數(shù)的irq號碼以及 irqbalance 預期的零退出代碼,定義腳本位置以執(zhí)行每個中斷請求。定義的腳本能指定零或多鍵值對來指導管理傳遞的 irq 中 irqbalance。
下列是為效鍵值對:
ban
有效值為 true(從平衡中排除傳遞的 irq)或 false(該 irq 表現(xiàn)平衡)。

      balance_level
      允許用戶重寫傳遞的 irq 平衡度。默認設置下,平衡度基于擁有 irq 設備的 PCI 設備種類。有效值為 none、package、cache、或 core。

      numa_node
      允許用戶重寫視作為本地傳送 irq 的 NUMA 節(jié)點。如果本地節(jié)點的信息沒有限定于 ACPI,則設備被視作與所有節(jié)點距離相等。有效值為識別特定 NUMA 節(jié)點的整數(shù)(從0開始)和 -1,規(guī)定 irq 應被視作與所有節(jié)點距離相等。

--banirq
將帶有指定中斷請求號碼的中斷添加至禁止中斷的列表。


您也可以使用 IRQBALANCE_BANNED_CPUS 環(huán)境變量來指定被 irqbalance 忽略的 CPU 掩碼。

2 tuna

Tuna 使您能夠控制處理器和調(diào)度關聯(lián)。此章節(jié)包含命令行界面,但是也可使用有相同功能范圍的圖形界面。運行命令行 tuna 啟動圖形工具。

Tuna 接受多種按順序處理的命令行參數(shù)。下列命令將負載分配到四個 socket中。

tuna --socket 0 --isolate \n --thread my_real_time_app --move \n --
irq serial --socket 1 --move \n --irq eth* --socket 2 --spread \n --
show_threads --show_irqs

--gui
打開圖形用戶界面。


--cpu
取用由 Tuna 控制的 CPU 逗號分隔列表。直到指定新列表前此列表均有效。


--config_file_apply
將配置文件名稱應用于系統(tǒng)。


--config_file_list
列出預加載配置文件。


--cgroup
用于連接 --show_threads。如果啟用控制組,顯示控制組類型,該控制組處理顯示帶有 --show_threads 所屬于的控制組類型。


--affect_children
指定后,Tuna 影響子線程以及父線程。


--filter
過濾顯示,只顯示受影響的實體。


--isolate
取用 CPU 的逗號分隔列表。Tuna 從指定的 CPU 中遷移線程。


--include
取用 CPU 的逗號分隔列表,Tuna 允許所有線程在指定的 CPU 上運行。


--no_kthreads
指定此參數(shù)后,Tuna 不影響內(nèi)核線程。


--move
將選擇的實體移至指定的 CPU 中。


--priority
指定線程調(diào)度器策略和優(yōu)先級。有效調(diào)度器策略為 OTHER、FIFO、 RR、BATCH、或者 IDLE。

當策略為 FIFO 或者 RR,有效的優(yōu)先級值為從 1(最低)到 99(最高)的整數(shù)。默認值是 1。例如,tuna--threads 7861 --priority=RR:40 為線程 7861 設定了 RR(輪循)的策略和 40 的優(yōu)先級。

當策略是 OTHER、BATCH、或者 IDLE,唯一有效優(yōu)先級值為 0,它也是默認值。


--show_threads
顯示線程列表。


--show_irqs
顯示 irq 列表。


--irqs
取用受 Tuna 影響的 IRQ 逗號分隔列表 。直到指定新列表之前此列表均有效。使用 + 可將 IRQ 添加至列表,使用 - 可從列表中移除。


--save
將內(nèi)核線程調(diào)度保存至指定文件。


--sockets
取用受 Tuna 控制的 CPU socket逗號分隔列表。該選項考慮了系統(tǒng)的拓撲結(jié)構(gòu),例如共享單一處理器緩存,且在同一個物理芯片上的核心。


--threads
取用受 Tuna 控制的線程逗號分隔列表。直到指定新列表之前此列表均有效。使用 + 可將線程添加至列表,- 可從列表中移除。


--no_uthreads
禁止影響用戶線程的操作。


--what_is
更多幫助,請參見選定的實體。


--spread
平均分配 --threads 指定的線程至 --cpus 指定的 CPU。

3 ethtool

ethtool 工具允許管理員查看和編輯網(wǎng)絡接口卡設置。這有助于觀察某些設備的統(tǒng)計信息,比如被設備丟棄的數(shù)據(jù)包的數(shù)量。

4 ss

ss 是一個命令行工具,顯示 socket的統(tǒng)計信息,允許管理員超時訪問設備性能。默認設置下,ss 列出打開的非監(jiān)聽且已建立聯(lián)系的 TCP socket,但向管理員提供一些為篩選掉特定 socket數(shù)據(jù)的有用選項。
ss -tmpie 是一個常用命令,顯示所有 TCP socket(t、內(nèi)部 TCP 信息(i)、 socket內(nèi)存使用 (m)、
使用 socket的進程 (p)、和詳細的 socket信息(i)。

5 tuned

Tuned 是一個調(diào)整的后臺程序,在某種工作負載量下通過設置調(diào)整配置文件使操作系統(tǒng)有更好的性能表現(xiàn)。
對其進行配置,使其對 CPU 和網(wǎng)絡使用的變化做出響應,調(diào)整設置以提高激活設備的性能,并減少在未激活設備中的能耗。


在 /etc/tuned/tuned-main.conf 文件中編輯 dynamic_tuning 參數(shù)以配置動態(tài)調(diào)整行為。您也能在調(diào)整檢查使用和更新調(diào)整細節(jié)之間,使用 update_interval 參數(shù)以秒為單位配置時間。

6 tuned-adm

tuned-adm 是一個命令行工具,提供一些不同配置文件以提高一些特定用例性能。它也提供一個評估系統(tǒng)和輸出推薦的調(diào)整配置文件的子命令(tuned-adm recommend)。在您系統(tǒng)安裝時它也能設置默認配置文
件,以便能用于返回默認配置文件。


自紅帽企業(yè)版 Linux 7 起,tuned-adm 有能力運行所有命令,這些命令是啟用和禁用調(diào)整配置文件的一部分。這允許您添加 tuned-adm 中不可用的環(huán)境特定檢測。例如在選擇應用何種調(diào)整配置文件之前,檢測系統(tǒng)是否是主數(shù)據(jù)庫節(jié)點。


紅帽企業(yè)版 Linux 7 在配置定義文件中提供 include 參數(shù),允許您將自己的 tuned-adm 配置文件建立在存在的配置文件基礎上。


以下調(diào)整配置文件是隨 tuned-adm 一起提供的,并由紅帽企業(yè)版 Linux 7 支持。

吞吐量性能
服務器配置文件的重點在于提高吞吐量。這是默認配置文件,并是為大多數(shù)系統(tǒng)推薦的。
通過設置 intel_pstate 和 max_perf_pct=100,與節(jié)約能耗相比,該配置文件更注重性能表現(xiàn)。它能啟用透明大頁面,使用 cpupower 來設置 performance CPU 頻率管理器,并將輸入/輸出調(diào)度器設置為 deadline。它同樣將 kernel.sched_min_granularity_ns 設置為10 μ s,將 kernel.sched_wakeup_granularity_ns 設置為 15 μ s,以及將
vm.dirty_ratio 設置 40%。


延遲性能
服務器配置文件的重點在于降低延遲。該配置文件是為延遲敏感的工作負載所推薦的,其中工作負載會從 c- 狀態(tài)調(diào)整和透明大頁面增加的 TLB 高效性中獲益。
通過設置 intel_pstate 和 max_perf_pct=100,與節(jié)約能耗相比,該配置文件更注重性能表現(xiàn)。它能啟用透明大頁面,使用 cpupower 來設置 performance CPU 頻率管理器,并請求值為 1 的 cpu_dma_latency。


網(wǎng)絡延遲
服務器配置文件的重點在于降低網(wǎng)絡延遲。

通過設置 intel_pstate 和 max_perf_pct=100,與節(jié)約能耗相比,該配置文件更注重性能表現(xiàn)。它禁用透明大頁面以及自動 NUMA 平衡 。它使用 cpupower 來設置 performance CPU 頻率管理器,并請求值為 1 的 cpu_dma_latency。它同樣將 busy_read 和 busy_poll 的時間設置為 50 μ s,并將 tcp_fastopen 設置為 3。


網(wǎng)絡吞吐量
服務器配置文件的重點在于提高網(wǎng)絡吞吐量。
通過設置 intel_pstate 和 max_perf_pct=100,與節(jié)約能耗,該配置文件更注重性能表現(xiàn)。它能啟用透明大頁面,使用 cpupower 來設置 performance CPU 頻率管理器,它同樣將kernel.sched_min_granularity_ns 設置為 10 μ
s,kernel.sched_wakeup_granularity_ns 設置為 15 μ s,以及 vm.dirty_ratio 設置為 40%。


虛擬來賓
虛擬來賓是一個重點在于優(yōu)化紅帽企業(yè)版 Linux 7 虛擬機器性能的配置文件。
通過設置 intel_pstate 和 max_perf_pct=100,與節(jié)約能耗相比,該配置文件更注重性能表現(xiàn)。它降低了虛擬內(nèi)存的交換。啟用透明大頁面,使用 cpupower 來設置 performance CPU頻率管理器。它也能將 kernel.sched_min_granularity_ns 設置為 10 μ
s,kernel.sched_wakeup_granularity_ns 設置為 15 μ s,以及將 vm.dirty_ratio設置為 40%。


虛擬-主機
虛擬主機是一個重點在于優(yōu)化紅帽企業(yè)版Linux 7虛擬主機的性能的配置文件。
通過設置 intel_pstate 和 max_perf_pct=100,相比節(jié)約能耗,該配置文件更注重性能表現(xiàn)。它降低了虛擬內(nèi)存的交換。它能啟用透明大頁面,更頻繁地重寫臟頁到磁盤。使用 cpupower來設置 performance CPU 頻率管理器,它將 kernel.sched_min_granularity_ns 設置為 10 μ 秒,kernel.sched_wakeup_granularity_ns 設置為 15 μ秒,kernel.sched_migration_cost 設置為 5 μ 秒,以及 vm.dirty_ratio 設置為
40%

7 perf

perf 提供一些有用的指令,此章節(jié)列出了其中一些指令。perf 的更多信息請參見《 紅帽企業(yè)版 7 開發(fā)者指
南》, 可在下列網(wǎng)站中查找 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/ 或者參見手冊頁。


perf stat
此命令為常見性能事件提供整體數(shù)據(jù),包括執(zhí)行步驟和消耗所用的時間周期。您可使用選項標志來收集事件數(shù)據(jù),而非默認測量事件。自紅帽企業(yè)版 Linux 6.4 起,根據(jù)一個或多個特定控制組(c組),可使用 perf stat 篩選監(jiān)控。


更多信息請參見手冊頁:

$ man perf-stat


perf record
此命令將性能數(shù)據(jù)記錄到隨后可使用 perf report 分析的文件中。更多信息,請參見手冊頁。

$ man perf-record


perf report
此命令從文件中讀取性能數(shù)據(jù)并分析記錄數(shù)據(jù),更多信息,請參見手冊頁。
$ man perf-report


perf list
此命令列出特定機器上有效事件。這些事件因系統(tǒng)性能監(jiān)控硬件和軟件配置而異。更多信息,請參見手冊頁。
$ man perf-list


perf top
此命令執(zhí)行與 top 工具相似的功能。它實時生成并顯示性能計數(shù)器配置文件。更多信息,請參見手冊頁。
$ man perf-top


perf trace
此命令執(zhí)行與 strace 工具相似的功能。它監(jiān)控特定線程或進程使用的系統(tǒng)調(diào)用以及該應用程序接收的所有信號??色@得其他的跟蹤目標。請參見手冊頁以查看完整列表:
$ man perf-trace

8 x86_energy_perf_policy

x86 energyperfpolicy 工具允許管理員定義性能和能效的相對重要性。由 kernel-tools 軟件包提供。

查看當前策略,運行以下命令:

x86_energy_perf_policy -r

設置新策略,運行以下命令:

x86_energy_perf_policy profile_name

用以下配置文件的其中之一替代配置文件名。
performance
處理器不為節(jié)能而降低性能。這是默認值。


normal
處理器能容忍由潛在的顯著節(jié)能所造成的微小性能下降。對于大多數(shù)服務器和桌面而言這是合理的節(jié)省。


powersave
處理器接受潛在的顯著性能下降,以便充分利用能效。

9 turbostat

turbostat 工具提供系統(tǒng)處于不同狀態(tài)所用時間的詳細信息。 Turbostat 由 kernel-tools 軟件包提供。


默認設置下,turbostat 為整個系統(tǒng)顯示計數(shù)器結(jié)果的摘要,隨后每隔五秒出現(xiàn)計數(shù)器結(jié)果,以下列標頭:


pkg
處理器軟件包編號。


core
處理器內(nèi)核編號。


CPU
LinuxCPU(邏輯處理器)編號。


%c0
cpu 執(zhí)行完畢的指令間隔百分比。


GHz
當 CPU 處于 c0 狀態(tài)時,平均時鐘速度。


TSC
整個間隔進程中的平均時鐘速度。


%c1、 %c3、和 %c6
處理器分別在 c1、c3 或者 c6 狀態(tài)下間隔百分比。


%pc3 或者 %pc6
處理器分別在 pc3 或者 pc6 狀態(tài)下的間隔百分比。
使用 -i 選項指定計數(shù)器結(jié)果間的不同周期,例如:運行 turbostat -i 10 改為每10秒顯示結(jié)果。

10 numastat

1 概述

numastat 由 numactl 軟件包提供,并以每個 NUMA 節(jié)點為基礎,為處理器和操作系統(tǒng)顯示內(nèi)存統(tǒng)計數(shù)據(jù)(例如分配時斷時續(xù))。

2 numastat 默認跟蹤類別

numastat 命令的默認跟蹤類別如下所示:
numa_hit
成功分配至該節(jié)點的頁面數(shù)量。


numa_miss
因預期節(jié)內(nèi)存不足分配至該節(jié)點的頁面數(shù)量。每個 numa_miss 事件在另一個節(jié)點上都有相應的
numa_foreign 事件。


numa_foreign
原本預期分配至此節(jié)點,而改為分配至其他節(jié)點的頁面數(shù)量。numa_foreign 事件在另外節(jié)點上,有一個相應的 numa_miss 事件。


interleave_hit
成功分配至該節(jié)點、交叉存取策略頁面數(shù)量。


local_node
由節(jié)點上進程成功分配至該節(jié)點的頁面數(shù)量。


other_node
由其他節(jié)點的進程分配至該節(jié)點的頁面數(shù)量。


提供以下任一選項會改變按兆字節(jié)內(nèi)存計算的顯示單元(約兩個小數(shù)位),且其他指定的 numastat 行為也會改變,描述如下:

-c
水平濃縮信息的顯示表。這有助于含有大量 NUMA 節(jié)點的系統(tǒng),在某種程度上列寬度和列內(nèi)空間不可預測。使用該選項時,內(nèi)存的數(shù)量四舍五入到最近的兆。


-m
根據(jù)單位節(jié)點,顯示系統(tǒng)范圍的內(nèi)存使用信息,與 /proc/meminfo 中的信息類似。


-n
使用更新的格式、兆為度量單位,顯示和如下原始 numastat 命令相同信息:(numa_hit、numa_miss、numa_foreign、interleave_hit、local_node 和 other_node)。


-p pattern
為指定模式顯示單位節(jié)點內(nèi)存信息。如果模式的值是由數(shù)字組成的,numastat 假定它是數(shù)字進程標識符。否則,numastat 從進程命令行查找指定的模式。
假定 -p 選項值后輸入的命令行參數(shù)是附加模式,目的是將其過濾 。附加模式擴展,而非縮減過濾器。


-s
將顯示的數(shù)據(jù)按降序排列,以便將最大的內(nèi)存消耗者(根據(jù)所有列)列在首位。


您也可指定節(jié)點,這樣表格將根據(jù)節(jié)點列分類。使用該選項時,節(jié)點值必須馬上采用 -s 選項,具體如下:
numastat -s2
不要在選項和其值之間使用空格符。


-v
顯示更多冗長的信息。即多進程的進程信息將顯示每個進程的細節(jié)信息。


-V
顯示 numastat 版本信息。


-z
從顯示的信息中省略表中只為 0 值的行和列。請注意為了便于顯示,一些四舍五入后接近 0 的值不會從顯示輸出中被省略。

11 numactl

1 概述

Numactl 允許管理員使用指定的調(diào)度或內(nèi)存放置策略來運行進程。Numactl 也能為共享的內(nèi)存段或文件設置永久策略,以及進程的處理器關聯(lián)和內(nèi)存關聯(lián)。

2 參數(shù)

Numactl 提供許多實用的選項。此附錄概述一部分選項,也為用戶提供了一些使用建議,但并不詳細。

--hardware
顯示系統(tǒng)中的可用節(jié)點,且包含節(jié)點間的相對距離的詳細目錄。


--membind
確保內(nèi)存只由指定節(jié)點分配。如果指定地點沒有足夠的可用內(nèi)存,分配會失敗。


--cpunodebind
確保指定命令及其子進程只在指定的節(jié)點上執(zhí)行。


--phycpubind
確保指定的命令及其子進程只在指定的處理器上執(zhí)行。


--localalloc
指明內(nèi)存應當始終從本地節(jié)點分配。


--preferred
指定分配內(nèi)存的優(yōu)選節(jié)點。如果內(nèi)存不能從指定的節(jié)點分配,其他的節(jié)點將被用于回退。

12 numad

1 概述

numad 是一個自動 NUMA 關聯(lián)管理后臺程序。為了動態(tài)提高 NUMA 資源分配和管理,它在系統(tǒng)內(nèi)監(jiān)控

NUMA 的拓撲結(jié)構(gòu)和資源使用。
注意啟用 numad 時 ,其行為將替代默認的自動 NUMA 平衡的行為。

2 在命令行使用 numad

將 numad 作為執(zhí)行表使用,只需運行:

numad

numad 運行的時候,其活動被記錄在 /var/log/numad.log。它會持續(xù)運行直到被以下命令終止:

numad -i 0

終止 numad 不會移除它所做的提高 NUMA 關聯(lián)的變更。如果系統(tǒng)使用有顯著的變化,再次運行 numad 能調(diào)整關聯(lián)來提高新條件下的性能。


如需將 numad 管理限制為特定進程,用下列選項來啟動它:

numad -S 0 -p pid

-p pid
該選項將指定的 pid 添加到顯式的包含列表中。當指定的進程達到 numad 進程的顯著門限值,指定的進程才會被管理。


-S 0
它將進程掃描的類型設置為 0,這會將 numad 管理限制到顯式包含的進程

3 將 numad 作為服務運行

它嘗試基于當前系統(tǒng)的工作負載來動態(tài)調(diào)整系統(tǒng)。其活動記錄在/var/log/numad.log。

如需啟動服務,運行:
systemctl start numad.service
如需重啟后服務持久,運行:
chkconfig numad on

13 taskset

taskset 工具是由 util-linux 軟件包提供的。它允許管理員檢索和設置正在運行的進程的處理器關聯(lián),或通過
指定的處理器關聯(lián)運行進程。
重要taskset 不保證本地內(nèi)存分配。如果您需要本地內(nèi)存分配的額外性能收益,紅帽推薦使用 numactl來替代 taskset。


設置正在運行的進程的 CPU 關聯(lián),運行下列命令:

taskset -c processors pid

使用處理器的逗號分隔列表或處理器的范圍(例如,1、3、5-7)替換 processors。使用欲重新配置的進程 的進程標識替換 pid 。
用指定的關聯(lián)運行進程,運行下列命令:

taskset -c processors -- application

用處理器的逗號分隔列表或處理器的范圍替換 processors。使用您欲運行的應用程序的命令、選項和參數(shù)替換 application。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI