導航:首頁 > 操作系統 > linux性能瓶頸

linux性能瓶頸

發布時間:2024-04-06 17:25:56

『壹』 linux啟動後,網卡服務無法啟動,需要手動執行service network restart才可以,如何處理系統啟動後網卡也

在/etc/sysconfig/network-scripts中添加
ONBOOT=yes設置網路開機自動啟動

『貳』 程序裝載進入內存

上一講,我們看到了如何通過鏈接器,把多個文件合並成一個最終可執行文件。在運行這些可執行文件的時候,我們其實是通過一個裝載器,解析 ELF 或者 PE 格式的可執行文件。裝載器會把對應的指令和數據載入到內存裡面來,讓 CPU 去執行。

說起來只是裝載到內存裡面這一句話的事兒,實際上裝載器需要滿足兩個要求。

第一,可執行程序載入後佔用的內存空間應該是連續的 ,執行指令的時候,程序計數器是順序地一條一條指令執行下去。這也就意味著,這一條條指令需要連續地存儲在一起。

第二,我們需要同時載入很多個程序,並且不能讓程序自己規定在內存中載入的位置。 雖然編譯出來的指令里已經有了對應的各種各樣的內存地址,但是實際載入的時候,我們其實沒有辦法確保,這個程序一定載入在哪一段內存地址上。因為我們現在的計算機通常會同時運行很多個程序,可能你想要的內存地址已經被其他載入了的程序佔用了。

要滿足這兩個基本的要求,我們很容易想到一個辦法。那就是我們可以在內存裡面,找到一段連續的內存空間,然後分配給裝載的程序,然後把這段連續的內存空間地址,和整個程序指令里指定的內存地址做一個映射。

我們把指令里用到的內存地址叫作 虛擬內存地址 (Virtual Memory Address),實際在內存硬體裡面的空間地址,我們叫 物理內存地址 (Physical Memory Address)。

程序里有指令和各種內存地址,我們只需要關心虛擬內存地址就行了。對於任何一個程序來說,它看到的都是同樣的內存地址。我們維護一個虛擬內存到物理內存的映射表,這樣實際程序指令執行的時候,會通過虛擬內存地址,找到對應的物理內存地址,然後執行。因為是連續的內存地址空間,所以我們只需要維護映射關系的起始地址和對應的空間大小就可以了。

內存分段

這種找出一段連續的物理內存和虛擬內存地址進行映射的方法,我們叫分段(Segmentation)。這里的段,就是指系統分配出來的那個連續的內存空間。

分段的辦法很好,解決了程序本身不需要關心具體的物理內存地址的問題,但它也有一些不足之處,第一個就是內存碎片(Memory Fragmentation)的問題。

我們來看這樣一個例子。我現在手頭的這台電腦,有 1GB 的內存。我們先啟動一個圖形渲染程序,佔用了 512MB 的內存,接著啟動一個 Chrome 瀏覽器,佔用了 128MB 內存,再啟動一個 Python 程序,佔用了 256MB 內存。這個時候,我們關掉 Chrome,於是空閑內存還有 1024 - 512 - 256 = 256MB。按理來說,我們有足夠的空間再去裝載一個200MB 的程序。但是,這 256MB 的內存空間不是連續的,而是被分成了兩段 128MB 的內存。因此,實際情況是,我們的程序沒辦法載入進來。

當然,這個我們也有辦法解決。解決的辦法叫 內存交換 (Memory Swapping)。

我們可以把 Python 程序佔用的那 256MB 內存寫到硬碟上,然後再從硬碟上讀回來到內存裡面。不過讀回來的時候,我們不再把它載入到原來的位置,而是緊緊跟在那已經被佔用了的 512MB 內存後面。這樣,我們就有了連續的 256MB 內存空間,就可以去載入一個新的200MB 的程序。如果你自己安裝過 Linux 操作系統,你應該遇到過分配一個 swap 硬碟分區的問題。這塊分出來的磁碟空間,其實就是專門給 Linux 操作系統進行內存交換用的。

虛擬內存、分段,再加上內存交換,看起來似乎已經解決了計算機同時裝載運行很多個程序的問題。不過,你千萬不要大意,這三者的組合仍然會遇到一個性能瓶頸。硬碟的訪問速度要比內存慢很多,而每一次內存交換,我們都需要把一大段連續的內存數據寫到硬碟上。所以,如果內存交換的時候,交換的是一個很占內存空間的程序,這樣整個機器都會顯得卡頓。

內存分頁

既然問題出在內存碎片和內存交換的空間太大上,那麼解決問題的辦法就是,少出現一些內存碎片。另外,當需要進行內存交換的時候,讓需要交換寫入或者從磁碟裝載的數據更少一點,這樣就可以解決這個問題。這個辦法,在現在計算機的內存管理裡面,就叫作 內存分頁 (Paging)。

和分段這樣分配一整段連續的空間給到程序相比,分頁是把整個物理內存空間切成一段段固定尺寸的大小 。而對應的程序所需要佔用的虛擬內存空間,也會同樣切成一段段固定尺寸的大小。這樣一個連續並且尺寸固定的內存空間,我們叫頁(Page)。從虛擬內存到物理內存的映射,不再是拿整段連續的內存的物理地址,而是按照一個一個頁來的。頁的尺寸一般遠遠小於整個程序的大小。在 Linux 下,我們通常只設置成 4KB。你可以通過命令看看你手頭的 Linux 系統設置的頁的大小。

getconf PAGE_SIZE

由於內存空間都是預先劃分好的,也就沒有了不能使用的碎片,而只有被釋放出來的很多4KB 的頁。即使內存空間不夠,需要讓現有的、正在運行的其他程序,通過內存交換釋放出一些內存的頁出來,一次性寫入磁碟的也只有少數的一個頁或者幾個頁,不會花太多時間,讓整個機器被內存交換的過程給卡住。

更進一步地,分頁的方式使得我們在載入程序的時候,不再需要一次性都把程序載入到物理內存中。我們完全可以在進行虛擬內存和物理內存的頁之間的映射之後,並不真的把頁載入到物理內存里,而是只在程序運行中,需要用到對應虛擬內存頁裡面的指令和數據時,再載入到物理內存裡面去。

實際上,我們的操作系統,的確是這么做的。當要讀取特定的頁,卻發現數據並沒有載入到物理內存里的時候,就會觸發一個來自於 CPU 的 缺頁錯誤 (Page Fault)。我們的操作系統會捕捉到這個錯誤,然後將對應的頁,從存放在硬碟上的虛擬內存里讀取出來,載入到物理內存里。這種方式,使得我們可以運行那些遠大於我們實際物理內存的程序。同時,這樣一來,任何程序都不需要一次性載入完所有指令和數據,只需要載入當前需要用到就行了。

通過虛擬內存、內存交換和內存分頁這三個技術的組合,我們最終得到了一個讓程序不需要考慮實際的物理內存地址、大小和當前分配空間的解決方案。這些技術和方法,對於我們程序的編寫、編譯和鏈接過程都是透明的。這也是我們在計算機的軟硬體開發中常用的一種方法,就是 加入一個間接層 。

通過引入虛擬內存、頁映射和內存交換,我們的程序本身,就不再需要考慮對應的真實的內存地址、程序載入、內存管理等問題了。任何一個程序,都只需要把內存當成是一塊完整而連續的空間來直接使用。

總結延伸

現在回到開頭我問你的問題,我們的電腦只要 640K 內存就夠了嗎?很顯然,現在來看,比爾·蓋茨的這個判斷是不合理的,那為什麼他會這么認為呢?因為他也是一個很優秀的程序員啊!

在虛擬內存、內存交換和內存分頁這三者結合之下,你會發現,其實要運行一個程序,「必需」的內存是很少的。CPU 只需要執行當前的指令,極限情況下,內存也只需要載入一頁就好了。再大的程序,也可以分成一頁。每次,只在需要用到對應的數據和指令的時候,從硬碟上交換到內存裡面來就好了。以我們現在 4K 內存一頁的大小,640K 內存也能放下足足 160 頁呢,也無怪乎在比爾·蓋茨會說出「640K ought to be enough for anyone」這樣的話。

不過呢,硬碟的訪問速度比內存慢很多,所以我們現在的計算機,沒有個幾 G 的內存都不好意思和人打招呼。

那麼,除了程序分頁裝載這種方式之外,我們還有其他優化內存使用的方式么?下一講,我們就一起來看看「動態裝載」,學習一下讓兩個不同的應用程序,共用一個共享程序庫的辦法。

『叄』 如何用十條命令在一分鍾內檢查linux伺服器性能

1、uptime命令
這個命令可以快速查看機器的負載情況。
2、dmesg命令
該命令會輸出系統日誌的最後10行。
3、vmstat命令
vmstat(8) 命令,每行會輸出一些系統核心指標,這些指標可以讓我們更詳細的了解系統狀態。
4、mpstat命令
該命令可以顯示每個CPU的佔用情況。
5、pidstat命令
pidstat命令輸出進程的CPU佔用率。
6、iostat命令
7、free命令
free命令可以查看系統內存的使用情況,
8、sar命令
sar命令在這里可以查看網路設備的吞吐率。
9、top命令
包含了前面好幾個命令的檢查的內容。

閱讀全文

與linux性能瓶頸相關的資料

熱點內容
java課表 瀏覽:553
如何在pdf裡面修改 瀏覽:927
橙光製作器檔案框在哪個文件夾 瀏覽:989
php如何抓取網頁數據 瀏覽:640
計數器單片機 瀏覽:964
游戲aoi演算法 瀏覽:844
phpmysqlint 瀏覽:912
怎麼從appstore商城買東西 瀏覽:184
大秀直播平台源碼 瀏覽:424
java視屏 瀏覽:934
電腦中如何給程序加密 瀏覽:240
java排序容器 瀏覽:942
職稱證書在哪個app下載 瀏覽:362
四九演算法算男女 瀏覽:659
javawindows8 瀏覽:497
2021世界程序員節 瀏覽:485
php翼支付 瀏覽:884
盈通伺服器ip地址 瀏覽:790
3des演算法的c語言實現 瀏覽:873
網上怎樣購買伺服器地址 瀏覽:815