湖南麒麟实时操作系统调优指南
????????湖南麒麟實時操作系統(tǒng)的實時性是建立在正確地調(diào)優(yōu)之上的。硬實時任務(wù)的要求較為苛刻,對系統(tǒng)的確定性以及穩(wěn)定性有較高要求,需要硬件、系統(tǒng)以及軟件的相互配合才能達(dá)到其要求。
???????? 硬實時任務(wù)對操作系統(tǒng)的延遲以及穩(wěn)定性提出了非常苛刻的要求,為了滿足這一要求,需要硬件、系統(tǒng)以及應(yīng)用軟件自身的配合。硬件與操作系統(tǒng)在設(shè)計時往往是要綜合考慮各種各樣的需求的,力圖綜合性能強大。而硬實時任務(wù)是一種特化的需求,這時就需要對操作系統(tǒng)以及硬件進(jìn)行精細(xì)調(diào)整,以求收益的最大化。實時軟件在部署時也需要針對硬件做出一些調(diào)整。
???????? 調(diào)優(yōu)是一個比較枯燥的任務(wù),需要大量的分析和嘗試,因此調(diào)優(yōu)中最經(jīng)常用到的手法就是控制變量法。也就是說,在調(diào)優(yōu)過程中,保持大部分參數(shù)不變,只改動一個或者幾個參數(shù),然后測試并觀察結(jié)果。通過這樣的微調(diào)慢慢地找到最佳參數(shù),而大跨度的參數(shù)調(diào)整往往會讓人迷失方向。
???????? 一般從硬件、內(nèi)核、應(yīng)用軟件三個大方面入手,進(jìn)行調(diào)優(yōu)。
從硬件的角度上來說,首先要移除不必要的外圍設(shè)備,這樣可以使操作系統(tǒng)減少一些不必要的中斷處理,也降低了驅(qū)動bug導(dǎo)致延遲異常的可能性。其次就是要關(guān)閉電源管理,以x86架構(gòu)為例,我們可以在BIOS中關(guān)閉ACPI的部分電源模式。不同主板的BIOS之間是存在差異的,但是只要遵照“一切降低能耗的行為都會對系統(tǒng)整體的性能有影響”這一準(zhǔn)則行動即可。對于x86架構(gòu)來說,還有一個比較重要的影響因素,被稱作SMI中斷。簡單來說,SMI中斷是一類比較特殊的中斷,對操作系統(tǒng)是透明的,即不受操作系統(tǒng)管制,觸發(fā)時會使CPU進(jìn)入SMM模式并執(zhí)行BIOS中的中斷處理代碼。硬件廠商用它來完成一些與硬件故障檢測相關(guān)的例行任務(wù)。
對內(nèi)核的調(diào)整比較雜亂,涉及的東西比較多,主要分為對內(nèi)核子系統(tǒng)的參數(shù)微調(diào)與處理器的重分配。對調(diào)度延遲影響比較大的內(nèi)核子系統(tǒng)有中斷子系統(tǒng)、調(diào)度器和定時器。對于一個線程來說,運行時的page fault與cache命中率對延遲有較大影響。同一個線程在不同處理器上的遷移(migrate)操作由于要刷新TLB和cache也會對延遲有較大影響,一般會限制此類操作。由于實時內(nèi)核強制使用內(nèi)核線程進(jìn)行中斷處理,我們可以啟用CPU隔離將大部分的中斷處理內(nèi)核線程和全部的普通優(yōu)先級進(jìn)程分配給一個單獨的CPU進(jìn)行處理,剩余的CPU可以專門處理實時任務(wù)。但是某些特定情況下將實時任務(wù)和其依賴的硬件中斷處理線程放到一個CPU上也是可以降低延遲的。從應(yīng)用的角度上來說,我們應(yīng)該將實時任務(wù)設(shè)置為SCHED_FIFO調(diào)度策略并設(shè)置一個比較高的優(yōu)先級。
一、基本調(diào)優(yōu)策略
1)?? ?系統(tǒng)和應(yīng)用隔離
????????a)?? ?使用隔離的CPU運行應(yīng)用;
????????b)?? ?綁定線程和IRQ到隔離的CPU;
????????c)?? ?至少預(yù)留一個CPU給系統(tǒng)使用,一般把cpu0給系統(tǒng)使用。
2)?? ?評定應(yīng)用的優(yōu)先級,更重要的任務(wù)擁有更高的優(yōu)先級,不要使用優(yōu)先級99,盡可能使用較低的優(yōu)先級。一般原則為,在滿足實時要求下給予一個進(jìn)程最低的優(yōu)先級。由于SCHED_FIFO調(diào)度策略在線程沒有主動釋放CPU時不會被強行搶占,高優(yōu)先級的SCHED_FIFO有可能會影響重要的內(nèi)核線程。
3)?? ?周期性發(fā)生的中斷和相關(guān)線程可綁定相同的CPU,最大限度的使用cache共享。
4)?? ?確定IRQ的優(yōu)先級,一般來說NIC中斷要高于USB中斷。
5)?? ?把應(yīng)用和對應(yīng)產(chǎn)生的IRQ綁定到相同CPU。
二、系統(tǒng)tuning項
1.BIOS options
對BIOS的基本調(diào)整原則為
? ? 1) ?? ?關(guān)閉一切電源管理相關(guān)選項,禁止系統(tǒng)通過任何手段進(jìn)行降頻、節(jié)能等操作。一切此類操作都會對系統(tǒng)性能產(chǎn)生影響,同時充滿各類不確定性,可能產(chǎn)生各種延遲。
?? ?2) 關(guān)閉一切與SMI中斷有關(guān)的BIOS選項。X86處理器可以通過SMI中斷進(jìn)入SMM模式,執(zhí)行BIOS指定的代碼,該特性經(jīng)常用于實現(xiàn)各類硬件異常檢測與日志功能。由于此類中斷繞過了操作系統(tǒng),在操作系統(tǒng)層面不容易檢測到,可能會產(chǎn)生較大延遲。rt-tests包中提供了hwlatdetect工具可以監(jiān)測此類中斷產(chǎn)生的延遲。
X86主板BIOS中常見選項:
1)?? ?Power Management
????????a)?? ?Intel SpeedStep//一個通過降低CPU運行主頻來達(dá)到降低功耗的技術(shù)
????????b)?? ?AMD PowerNow//省熱降頻
2)?? ?System Management Interrupts (SMI)/ System management mode//系統(tǒng)管理模式SMM
????????a)?? ?Not handled by OS, handled by BIOS code
????????b)?? ?Used by many system services
????????–?? ?Thermal management//溫度管理
????????–?? ?Error Detection and Correction(EDAC)//錯誤檢測與糾正單元
????????–?? ?IPMI(Intelligent Platform Management Interface)//智能平臺管理接口,管理基于 Intel結(jié)構(gòu)的企業(yè)系統(tǒng)中所使用的外圍設(shè)備采用的一種工業(yè)標(biāo)準(zhǔn),用戶可以利用IPMI監(jiān)視服務(wù)器的物理健康特征,如溫度、電壓、風(fēng)扇工作狀態(tài)、電源狀態(tài)。IPMI 信息通過基板管理控制器 (BMC)(位于 IPMI 規(guī)格的硬件組件上)進(jìn)行交流。
2.System Services/SELinux
對系統(tǒng)服務(wù)調(diào)整的原則為盡量關(guān)閉一切無關(guān)系統(tǒng)服務(wù),系統(tǒng)安裝時可能會默認(rèn)安裝并啟動一些與實時任務(wù)無關(guān)的系統(tǒng)任務(wù),如sendmail(郵件服務(wù))等等。與此同時,需要關(guān)閉一些與電源管理和負(fù)載均衡相關(guān)的系統(tǒng)服務(wù)。
關(guān)閉相關(guān)服務(wù):
1)?? ?Cpuspeed – 控制電源管理相關(guān)的特性
2)?? ?Irqbalance – 根據(jù)負(fù)載情況動態(tài)分配中斷
3)?? ?pcscd
SELinux會對大部分系統(tǒng)操作進(jìn)行權(quán)限檢查,增加額外開銷,導(dǎo)致關(guān)機時間變長,所以部署系統(tǒng)一定要關(guān)閉SELinux。可以修改/etc/selinux/config文件,將SELINUX字段設(shè)置為disabled。
?
3.Cores/NUMA memory nodes
由于現(xiàn)代的SMP系統(tǒng)擁有大量的CPU,內(nèi)存訪問成了系統(tǒng)整體的瓶頸,NUMA架構(gòu)就是這個背景下的產(chǎn)物。NUMA(Non-uniform memory access)是一種內(nèi)存模型,在這個模型下,系統(tǒng)中每個CPU對于各個內(nèi)存區(qū)域的訪問速度是不一樣的。將每個CPU訪問速度最快的內(nèi)存區(qū)域稱為它的本地內(nèi)存,訪問較慢的內(nèi)存稱為遠(yuǎn)內(nèi)存。Linux中使用Node表示這樣的內(nèi)存區(qū)域。對于互相關(guān)聯(lián)的進(jìn)程或線程(如存在共享內(nèi)存,進(jìn)程間通信等),盡量分配到同一個NUMA節(jié)點中。?
進(jìn)程從一個CPU的調(diào)度隊列(Run Queue)被轉(zhuǎn)移至另一個CPU的調(diào)度隊列的操作被Linux內(nèi)核稱為Migration。在實時系統(tǒng)中,需要盡量避免這樣的操作,被轉(zhuǎn)移的任務(wù)在新的CPU上被第一次執(zhí)行時,新的CPU需要重新建立TLB緩存,以及CPU本地cache,會有比較大的延遲。
對于實時系統(tǒng),可以將一部分CPU從系統(tǒng)整體中隔離開來,專門用于執(zhí)行實時任務(wù),這樣可以減小實時任務(wù)被系統(tǒng)任務(wù)干擾的可能。
?? ?partrt工具可以將SMP系統(tǒng)中的CPU核心劃分成兩個部分,一個部分為實時部分,默認(rèn)稱為rt,另一部分用于運行非實時任務(wù),默認(rèn)稱為nrt。其具體原理為使用cgroup中的cpuset子系統(tǒng)進(jìn)行CPU的再分配。常見操作舉例,假設(shè)系統(tǒng)有0-40號CPU:
??
創(chuàng)建的rt集合默認(rèn)是關(guān)閉SMP負(fù)載均衡的,即一個進(jìn)程在某個CPU上開始運行后不會被遷移到其他的CPU上。可以使用:
??
開啟SMP負(fù)載均衡。
4.Timers//計時器選擇
1)?? ?Realtime中使用tsc(Timestamp Counter Register)
grub參數(shù):clocksource=tsc
powernow-k8.tscsync=1 //AMD速龍CPU頻率同步轉(zhuǎn)換
5.其他內(nèi)核啟動參數(shù)
1)?? ?idle=poll //禁止cpu進(jìn)入idle狀態(tài),更小的延遲,帶來更高的能量損耗
2)?? ?processor.max_cstate=1 //禁止時鐘進(jìn)入c-state
3)?? ?nohz=on //在特定情況下停止系統(tǒng)時鐘中斷。
4)?? ?nosoftlockup //阻止內(nèi)核使用soft lockup
5)?? ?intel_pstate=disable//禁止intel idle驅(qū)動進(jìn)行電源管理和CPU頻率調(diào)整
?
6.Journal fs
文件系統(tǒng)的日志功能會增加文件寫入以及文件屬性修改的不確定性,可以修改/etc/fstab文件中的文件系統(tǒng)掛載選項禁用掉atime和diratime。
禁止更新xfs日志文件系統(tǒng)的atime(文件最后訪問讀取時間)和nodiratime(目錄最后訪問讀取時間)。
7.避免運行額外程序
1)?? ?使用多用戶模式,關(guān)閉圖形界面:
2)?? ?禁用sendmail服務(wù)
3)?? ?禁用Remote Procedure Calls (RPCs)
4)?? ?禁用Network File System (NFS)
5)?? ?禁用Mouse Services
?? ?如果不使用圖形界面,取消鼠標(biāo)設(shè)備,卸載gpm
6)?? ?Automated tasks
?? ?檢查cron或at任務(wù)。
?
8.內(nèi)存交換(menory swapping)
1)?? ?確保系統(tǒng)有足夠的內(nèi)存,vmstat中si、so最好是0。
2)?? ?Out of Memory ( OOM)
OOM時,推薦使內(nèi)核進(jìn)入panic,而不是用oom_killer。因為OOM狀態(tài)下,系統(tǒng)具有不確定性。
9.網(wǎng)絡(luò)
1)?? ?考慮是否必須用TCP。TCP協(xié)議的重傳,Nagle算法,建立及關(guān)閉存在不確定性,在協(xié)議層面上就有高延遲的可能。
2)?? ?考慮在socket編程中使用TCP_NODELAY套接字選項禁用Nagle buffering algorithm。
3)?? ?Interrupt Coalescing //ethtool –C
4)?? ?Congestion //ethtool –A
5)?? ?使用Infiniband(IB)
6)?? ?設(shè)置/etc/sysctl.conf
7)?? ?使用RoCEE (RDMA over Converged Enhanced Ethernet)and High Performance Net working
10.Syslog
1)?? ?禁用syslogd
2)?? ?必須使用時請設(shè)置合適的syslog日志上傳時間。
11.OTHER migration
1)?? ?Using sched _nr_migrate to Limit SCHED _OTHER Task Migration//限制使用OTHER調(diào)度策略的進(jìn)程轉(zhuǎn)移到空閑CPU
12.實時調(diào)度節(jié)流
1)?? ?/proc/sys/kernel /sched_rt_period_us //設(shè)置實時進(jìn)程使用CPU的帶寬
2)?? ?/proc/sys/kernel/sched_rt_runtime_us //設(shè)置實時進(jìn)程使用CPU的百分比
?
三、實時應(yīng)用程序調(diào)優(yōu)
1)?? ?避免使用POSIX signals。使用POSIX Threads運行工作線程或通信。
2)?? ?避免使用sched _yield系統(tǒng)調(diào)用和其他同步機制。
3)?? ?互斥鎖處理。使用POSIX thread (pthread) mutex constructs。
4)?? ?Socket編程中使用TCP_NODELAY、TCP_CORK選項。
5)?? ?使用rtctl設(shè)定調(diào)度優(yōu)先權(quán)。
6)?? ?程序開始時加載動態(tài)鏈接庫。
7)?? ?使用_COARSE POSIX Clocks。
四、附錄
- 參數(shù)的持久化方法
直接修改/proc/sys/目錄下對應(yīng)的文件的值只作用于當(dāng)前運行狀態(tài),在系統(tǒng)重新啟動之后就會失效。可以通過修改/etc/sysctl.conf文件的值將修改持久化,使得系統(tǒng)重新啟動之后仍然保留這些設(shè)置。具體方法如下:
以/proc/sys/kernel/sched_rt_runtime_us文件為例,首先將/proc/sys/前綴去掉,得到kernel/sched_rt_runtime_us。然后將/替換為.得到kernel.sched_rt_runtime_us最后在/etc/sysctl.conf文件中寫入
kernel.sched_rt_runtime_us = <對應(yīng)的值>
這樣一行即可。
- grub.conf內(nèi)核命令行參數(shù)舉例
- 調(diào)優(yōu)實例
1、修改內(nèi)核參數(shù)
?? ?grub里增加參數(shù):
??
2、修改/etc/sysctl.conf
?? ?增加:?
3、關(guān)閉selinux
?? ?修改/etc/selinux/config:
??
4、關(guān)閉服務(wù)
5、BIOS里把IPMI關(guān)閉了
?? ?powermanager關(guān)閉
?? ?超線程關(guān)閉
6、vim /etc/fstab
??
?
總結(jié)
以上是生活随笔為你收集整理的湖南麒麟实时操作系统调优指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DIY一个低成本多功能点阵时钟!
- 下一篇: c/c++整理--c++面向对象(4)