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