① linux 性能優化-- cpu 切換以及cpu過高
本文先介紹了cpu上下文切換的基礎知識,以及上下文切換的類型(進程,線程等切換)。然後介紹了如何查看cpu切換次數的工具和指標的解釋。同時對日常分析種cpu過高的情況下如何分析和定位的方法做了一定的介紹,使用一個簡單的案例進行分析,先用top,pidstat等工具找出佔用過高的進程id,然後通過分析到底是用戶態cpu過高,還是內核態cpu過高,並用perf 定位到具體的調用函數。(來自極客時間課程學習筆記)
1、多任務競爭CPU,cpu變換任務的時候進行CPU上下文切換(context switch)。CPU執行任務有4種方式:進程、線程、或者硬體通過觸發信號導致中斷的調用。
2、當切換任務的時候,需要記錄任務當前的狀態和獲取下一任務的信息和地址(指針),這就是上下文的內容。因此,上下文是指某一時間點CPU寄存器(CPU register)和程序計數器(PC)的內容, 廣義上還包括內存中進程的虛擬地址映射信息.
3、上下文切換的過程:
4、根據任務的執行形式,相應的下上文切換,有進程上下文切換、線程上下文切換、以及中斷上下文切換三類。
5、進程和線程的區別:
進程是資源分配和執行的基本單位;線程是任務調度和運行的基本單位。線程沒有資源,進程給指針提供虛擬內存、棧、變數等共享資源,而線程可以共享進程的資源。
6、進程上下文切換:是指從一個進程切換到另一個進程。
(1)進程運行態為內核運行態和進程運行態。內核空間態資源包括內核的堆棧、寄存器等;用戶空間態資源包括虛擬內存、棧、變數、正文、數據等
(2)系統調用(軟中斷)在內核態完成的,需要進行2次CPU上下文切換(用戶空間-->內核空間-->用戶空間),不涉及用戶態資源,也不會切換進程。
(3)進程是由內核來管理和調度的,進程的切換只能發生在內核態。所以,進程的上下文不僅包括了用戶空間的資源,也包括內核空間資源。
(4)進程的上下文切換過程:
(5)、下列將會觸發進程上下文切換的場景:
7、線程上下文切換:
8、中斷上下文切換
快速響應硬體的事件,中斷處理會打斷進程的正常調度和執行。同一CPU內,硬體中斷優先順序高於進程。切換過程類似於系統調用的時候,不涉及到用戶運行態資源。但大量的中斷上下文切換同樣可能引發性能問題。
重點關注信息:
系統的就緒隊列過長,也就是正在運行和等待 CPU 的進程數過多,導致了大量的上下文切換,而上下文切換又導致了系統 CPU 的佔用率升高。
這個結果中有兩列內容是我們的重點關注對象。一個是 cswch ,表示每秒自願上下文切換(voluntary context switches)的次數,另一個則是 nvcswch ,表示每秒非自願上下文切換(non voluntary context switches)的次數。
linux的中斷使用情況可以從 /proc/interrupts 這個只讀文件中讀取。/proc 實際上是 Linux 的一個虛擬文件系統,用於內核空間與用戶空間之間的通信。/proc/interrupts 就是這種通信機制的一部分,提供了一個只讀的中斷使用情況。
重調度中斷(RES),這個中斷類型表示,喚醒空閑狀態的 CPU 來調度新的任務運行。這是多處理器系統(SMP)中,調度器用來分散任務到不同 CPU 的機制,通常也被稱為處理器間中斷(Inter-Processor Interrupts,IPI)。
這個數值其實取決於系統本身的 CPU 性能。如果系統的上下文切換次數比較穩定,那麼從數百到一萬以內,都應該算是正常的。但當上下文切換次數超過一萬次,或者切換次數出現數量級的增長時,就很可能已經出現了性能問題。這時,需要根據上下文切換的類型,再做具體分析。
比方說:
首先通過uptime查看系統負載,然後使用mpstat結合pidstat來初步判斷到底是cpu計算量大還是進程爭搶過大或者是io過多,接著使用vmstat分析切換次數,以及切換類型,來進一步判斷到底是io過多導致問題還是進程爭搶激烈導致問題。
CPU 使用率相關的重要指標:
性能分析工具給出的都是間隔一段時間的平均 CPU 使用率,所以要注意間隔時間的設置,特別是用多個工具對比分析時,你一定要保證它們用的是相同的間隔時間。比如,對比一下 top 和 ps 這兩個工具報告的 CPU 使用率,默認的結果很可能不一樣,因為 top 默認使用 3 秒時間間隔,而 ps 使用的卻是進程的整個生命周期。
top 和 ps 是最常用的性能分析工具:
這個輸出結果中,第三行 %Cpu 就是系統的 CPU 使用率,top 默認顯示的是所有 CPU 的平均值,這個時候你只需要按下數字 1 ,就可以切換到每個 CPU 的使用率了。繼續往下看,空白行之後是進程的實時信息,每個進程都有一個 %CPU 列,表示進程的 CPU 使用率。它是用戶態和內核態 CPU 使用率的總和,包括進程用戶空間使用的 CPU、通過系統調用執行的內核空間 CPU 、以及在就緒隊列等待運行的 CPU。在虛擬化環境中,它還包括了運行虛擬機佔用的 CPU。
預先安裝 stress 和 sysstat 包,如 apt install stress sysstat。
stress 是一個 Linux 系統壓力測試工具,這里我們用作異常進程模擬平均負載升高的場景。而 sysstat 包含了常用的 Linux 性能工具,用來監控和分析系統的性能。我們的案例會用到這個包的兩個命令 mpstat 和 pidstat。
下面的 pidstat 命令,就間隔 1 秒展示了進程的 5 組 CPU 使用率,
包括:
perf 是 Linux 2.6.31 以後內置的性能分析工具。它以性能事件采樣為基礎,不僅可以分析系統的各種事件和內核性能,還可以用來分析指定應用程序的性能問題。
第一種常見用法是 perf top,類似於 top,它能夠實時顯示佔用 CPU 時鍾最多的函數或者指令,因此可以用來查找熱點函數,使用界面如下所示:
輸出結果中,第一行包含三個數據,分別是采樣數(Samples)如2K、事件類型(event)如cpu-clock:pppH和事件總數量(Event count)如:371909314。
第二種常見用法,也就是 perf record 和 perf report。 perf top 雖然實時展示了系統的性能信息,但它的缺點是並不保存數據,也就無法用於離線或者後續的分析。而 perf record 則提供了保存數據的功能,保存後的數據,需要你用 perf report 解析展示。
1.啟動docker 運行進程:
2.ab工具測試伺服器性能
ab(apache bench)是一個常用的 HTTP 服務性能測試工具,這里用來模擬 Ngnix 的客戶端。
3.分析過程
CPU 使用率是最直觀和最常用的系統性能指標,在排查性能問題時,通常會關注的第一個指標。所以更要熟悉它的含義,尤其要弄清楚:
這幾種不同 CPU 的使用率。比如說:
碰到 CPU 使用率升高的問題,你可以藉助 top、pidstat 等工具,確認引發 CPU 性能問題的來源;再使用 perf 等工具,排查出引起性能問題的具體函數.
② 為什麼說linux文件系統,越用速度越快
這是linux的內存管理機制的優勢,其主要特點是,無論物理內存有多大,Linux 都將其充份專利用,將一些程屬序調用過的硬碟數據讀入內存,利用內存讀寫的高速特性來提高Linux系統的數據訪問性能。換句話說,每增加一些物理內存,Linux都將能充分利用起來,發揮了硬體投資帶來的好處。理論上說是越用越快,讀取內存比硬碟快多了,但是如果你伺服器內存太小,估計沒什麼感覺。
③ linux的文件系統與window文件系統有什麼區別
fat32 沒有日誌,抄不支持事務和災難恢復。單個文件最大 4G 好像。
ntfs 有日誌,支持文件壓縮、文件擴展流,訪問安全。但 ntfs 的訪問安全是和 windows nt 用戶系統集成的,不適用於其它操作系統。
ext3 有日誌,單個文件最大 16G - 2T。(根據格式化的參數而不同)
ext4 支持特大文件,16G-16T,特大硬碟 1E = 1024P = 1048576T。且向下兼容 ext3,可以把原有的 ext3 當作 ext4 來使用。性能和可靠性有不少提升。ext4 中也可以關閉日誌,ext3 沒有這個選項。
對開發而言,特別是小文件特別多的情況下,ext3 性能遠超 ntfs。特別一提的是,ext4 的寫入性能相對 ext3 有大幅度的提升。但同時注意到,ext4 沒有 win32 驅動。
④ Linux文件系統的特點
類似於 Windows下的C、D、E等各個盤,Linux系統也可以將磁碟、Flash等存儲設備劃分為若干個分區,在不同分區存放不同類別的文件。與Windows的C盤類似,Linux一樣要在一個分區上存放系統啟動所必需的文件,比如內核映象文件(在嵌入式系統中,內核一般單獨存放在一個分區中)內核啟動後運行的第一-個程序( init)給用戶提供操作界面的 shell程序、應用程序所依賴的庫等。這些必需、基本的文件合稱為根文件系統,它們存放在一個分區中。Linux 系統啟動後首先掛接這個分區,稱為掛接( mount)根文件系統。其他分區上所有目錄、文件的集合,也稱為文件系統。Linux 中並沒有C、D、E等盤符的概念,它以樹狀結構管理所有目錄、文件,其他分區掛接在某個目錄上,這個目錄被稱為掛接點或安裝點(mount point),然後就可以通過這個目錄來訪問這個分區上的文件了。比如根文件系統被掛接在根目錄「I」上後,在根目錄下就有根文件系統的各個目錄、文件:/bin、/sbin、/mnt等;再將其他分區掛接到/mnt目錄上,/mnt目錄下就有這個分區.的各個目錄、文件。在一個分區上存儲文件時,需要遵循一定的格式,這種格式稱為文件系統類型,比如fat16、fat32、ntfs、ext2、ext3、jffs2、yaffs 等。除這些擁有實實在在的存儲分區的文件系統類型外,Linux還有幾種虛擬的文件系統類型,比如proc、sysfs 等,它們的文件並不存儲在實際的設備上,而是在訪問它們時由內核臨時生成。比如 proc文件系統下的uptime文件,讀取它時可以得到兩個時間值(用來表示系統啟動後運行的秒數、空閑的秒數),每次讀取時都由內核即刻生成,每次讀取結果都不一樣。「文件系統類型」常被簡稱為「文件系統」,比如「硬碟第二個分區上的文件系統是EXT2」指的就是文件系統類型。所以「文件系統」這個術語,有時候指的是分區上的文件集合,有時候指的是文件系統類型,需要根據語境分辨,在閱讀各類文獻時需要注意這點。
⑤ 安裝linux 硬碟分區的時候應該選哪個文件系統
ext3 , ext4的文件系統對磁碟讀和寫的數據量比較多
如果很在意移動硬碟的佔用空間, 建議最好使用 ext2.
數據安全性方面, 還是ext3 , ext4的好。