歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 如何降低Linux 內存開銷

如何降低Linux 內存開銷

日期:2017/2/27 14:12:42   编辑:更多Linux
物理內存不足可能會嚴重影響 Linux® 的性能。在本文中,我們將學習如何精確地度量 Linux 系統所使用的內存量。還將以 Ubuntu 系統為例學習有關降低內存需求的實踐建議。

Linux 廣受追捧的一個優點是它比 Microsoft® Windows® 的效率更高,因此在不太前沿的硬件上也能很好地執行。對於依然使用 Windows 98 時代的機器的人來說,最新最卓越的軟件(特別是安全補丁)已經不再支持這些機器,因此這種性能優勢使 Linux 成為頗具吸引力的升級產品。

然而,問題的真相在於雖然 Linux 內核仍然可以配置成合理的大小和效率,但由於新計算機的處理能力大大加強,很多 Linux 桌面環境(例如 KDE 和 GNOME)都增加了許多特性。因此,在較老的硬件上默認安裝大多數發行版時,提供的性能都不是一流的。很多現代應用程序也是如此,例如,Firefox 之類的 Web 浏覽器和 OpenOffice 之類的辦公套件均功能完備,但是嘗試在只有 128MB RAM 的機器上運行這些程序,可能會成為非常痛苦的體驗!

該怎麼辦?丟掉所有舊的硬件然後升級?還是安裝 1995 年左右的 Linux 發行版?(如果您決定走這條路,我記得使用 Linux-FT 是一種很好的體驗。)

不要擔心:多年以前,Linux 社區中的人就已經認識到這個問題,Linux 內核和發行版的一大特性(有人喜歡說 這個 偉大特性)在於其能夠定制。本文將介紹如何對 Linux 系統進行裁減,以便在小容量的硬件上獲得更好的性能。

內存的作用

在大多數情況下,桌面操作系統性能的一個最重要因素就是系統可用的內存量。雖然擁有快速的處理器效果不錯,但是如果沒有足夠的物理內存保證一直很好地利用處理器,系統可能會花費大量時間用於在物理內存和交換空間之間的交換數據(這種情況稱為 磁盤抖動),而 CPU 的大部分時間都是空閒的。因此對於老式的系統來說,額外添加內存通常是提高性能的最簡單方法。然而,有很多原因決定了這種方法不太可能,例如缺少空閒插槽,對於一些系統(尤其是筆記本或基於 RAMBUS 的系統)來說,則是缺少買得起的 RAM,以及不希望在一台過期的系統上花更多錢這個容易理解的心理。

如果無法或不願意升級 RAM,接下來最好減少系統上的 RAM 需求。本文將展示為 Linux 機器打造內存天堂 5 個簡單步驟。

步驟 1:選擇正確的桌面環境

惟一需要做的重要選擇就是要安裝的 Linux 發行版和桌面環境(DE)。盡管這是截然不同的選擇,但是發行版的選擇可能影響 DE 的選擇。雖然沒有任何東西能夠阻擋您在系統上安裝軟件,例如在 Ubuntu 上安裝 Fluxbox;但是您會發現如果簡單地使用發行版所附帶的默認 DE,一切就會輕松很多。

在本文方案中,目標是尋找面向桌面的簡單發行版,以便於新用戶使用。我從 Ubuntu 6.10 開始入手,它和 GNOME 2.16 一起推出。

對於基本系統來說,我選擇了一台配有 800MHz 處理器和 256MB RAM 的老機器。我將執行了兩次測試,一次使用全部 256MB RAM 正常引導,一次在內核行上附加了 mem=128M,這會強制內核只識別 128MB 物理內存。這樣就可以有效地試驗 256MB 和 128MB 的機器,而不必實際使用另一台物理機器(也不必反復從機器中插拔內存)。這個內核行選項能夠足夠近似地模擬 128 MB 的機器的行為;注意,如果真的只有 128MB 內存,可能會遇到其他問題,舉例來說,要使用 Ubuntu,必須使用一個不同於普通機器磁盤的安裝盤,它是專門為少於 192MB RAM 的機器准備的。

為了了解基本水平的內存使用情況,引導該系統,登錄到桌面系統,並啟動一個終端(在本文後面的內容中,我將這種設置稱為 基本使用水平(base level));然後使用 free 命令來檢查系統中的空閒內存量,結果如清單 1 所示。

清單 1. Ubuntu 在 256MB 機器上的基本使用水平

ubuntu # free total used free shared buffers cached Mem: 255988 231704 24284 0 6432 139292 -/+ buffers/cache: 85980 170008 Swap: 746980 0 746980

第一行說明 256MB RAM 中有 231MB “正在使用”。下一行告訴我們盡管有 231MB 內存正在使用,但是應用程序只使用了其中的 86MB;緩沖區和高速緩存使用了其余的內存。

要評價性能,該清單中最重要的部分是 Swap 一行;它告訴我們當前沒有使用任何交換空間,這說明目前沒有真正遇到內存問題。系統現在可以全部裝入物理內存,而不必借助慢速的基於磁盤的交換空間。

然後,為了了解系統的日常使用情況,啟動一個 Web 浏覽器(Firefox 2.0),然後用其打開 developerWorks,將即時消息客戶機(Gaim)連接到 MSN,並使用文件管理器來浏覽文件夾,又在 OpenOffice 中打開一個相當大的 Microsoft Word 格式的文檔。(在本文剩余的部分中,將這種設置稱為 輕量級使用水平(light usage level)。)

一旦成功加載這些之後, free 命令將如清單 2 所示。

清單 2. Ubuntu 在 256MB 機器上的輕量級使用水平

ubuntu # free total used free shared buffers cached Mem: 255988 252196 3792 0 21276 87500 -/+ buffers/cache: 143420 112568 Swap: 746980 18676 728304

可以看到內存部分稍有變化。現在應用程序使用了 143MB 的物理內存,其余的內存均被緩沖區占用;另外,系統現在使用了 18MB 的交換空間。在這種輕量級的辦公任務情況下,系統的可用性通常看起來很不錯,但是已經沒有太多發展空間了,可能無法進行需要資源更多的操作,例如編輯巨大的數字照片或視頻文件,因為系統很快就會在處理時發生停歇。

為了了解系統在只有 128MB 時的執行情況,我重新引導了系統,並在內核行後面附加了 mem=128M 選項,就像前面介紹的一樣。在與清單 1 同樣的基本使用水平上,使用 128MB RAM 得到的結果如清單 3 所示。

清單 3. Ubuntu 在 128MB 機器上的基本使用水平

ubuntu # free total used free shared buffers cached Mem: 126100 121464 4636 0 1636 37000 -/+ buffers/cache: 82828 43272 Swap: 746980 17924 729056

可以看到現在只使用了 128MB 內存,已經開始使用交換空間了,並且現在實際上還沒有開始執行任何操作。

啟動同一組應用程序產生的結果如清單 4 所示。

清單 4. Ubuntu 在 128MB 機器上的輕量級使用水平

ubuntu # free total used free shared buffers cached Mem: 126100 123608 2492 0 392 51208 -/+ buffers/cache: 72008 54092 Swap: 746980 98452 648528

從這些數字中可以預測出,現在該機器在正常使用時的響應能力非常低,對於這些簡單任務來說基本上還可以使用,但是會非常頻繁地訪問磁盤,我肯定不喜歡使用它作為自己的主要機器。 可以看到應用程序需要的內存總量大約是 170MB,但內存中只裝入了 72MB,因此 98MB 被轉移到交換空間。這有助於解釋系統響應能力降低的原因!

下一組測試,我決定使用 Xubuntu,這是與 Ubuntu 有關項目的發行套件。這個發行版與 Ubuntu 非常類似,但使用了 Xfce 4.4 Beta 2 DE,而不是 GNOME。與更為流行的 GNOME 和 KDE 項目不同(它們強調的是實現最佳功能),Xfce 被設計成輕量級的,因此有望更好地滿足過期硬件的要求。我們將使用這個發行版執行與 Ubuntu 相同的測試。

在清單 5 中可以看出基本 DE 大約少使用了 25MB 的應用程序內存,並且緩沖區和緩存所使用的內存顯著少於 Ubuntu(這可能意味著文件操作較少)。

清單 5. Xubuntu 在 256MB 機器上的基本使用水平

xubuntu # free total used free shared buffers cached Mem: 255988 170964 85024 0 6004 104700 -/+ buffers/cache: 60260 195728 Swap: 746980 0 746980

在清單 6 中,再次啟動那套測試應用程序(Web 浏覽器、IM 客戶機和文字處理器)。可以看到對於相同的應用程序組合,所需的內存比 Ubuntu 大約減少了 20MB(其中 126MB 位於物理內存,17MB 位於交換空間,總共是 143 MB;在 Ubuntu 上是 143MB 加 18MB,總共是 161MB)。

清單 6. Xubuntu 在 256MB 機器上的輕量級使用水平

xubuntu # free total used free shared buffers cached Mem: 255988 252180 3808 0 1972 124008 -/+ buffers/cache: 126200 129788 Swap: 746980 16956 730024

清單 7 給出了只有 128MB RAM 時的基本使用水平。這次這個內存有限的系統表現良好,沒有使用交換空間。

清單 7. Xubuntu 在 128MB 機器上的基本使用水平

xubuntu # free total used free shared buffers cached Mem: 126100 123228 2872 0 4252 60484 -/+ buffers/cache: 58492 67608 Swap: 746980 0 746980

在清單 8 中,再次啟動測試應用程序。雖然與 Ubuntu 相比,這個系統的表現更好,但是它依然使用了大量的交換空間,這個機器依然有些緩慢(只稍微比 Ubuntu 好一些)。

清單 8. Xubuntu 在 128MB 機器上的輕量級使用水平

xubuntu # free total used free shared buffers cached Mem: 126100 123980 2120 0 468 56276 -/+ buffers/cache: 67236 58864 Swap: 746980 64516 682464

從這些數字可以看出,Xubuntu 在整個過程中使用的內存通常更少;因此如果您的系統只有 128MB(或更少內存),這可能是較好的選擇。

Linux 發行版的一個重要特征是它們通常不需要花費任何費用,因此很容易下載多個發行版,然後逐一試用一段時間,從而確定喜歡使用的發行版,及其在硬件上的執行情況。如果硬件非常有限,可能希望考察一下 Damn Small Linux 之類的發行版,它宣稱可以在只有 16MB RAM 的 486DX 處理器的系統上運行。

由於我的 256MB 系統上還有一點可用空間,所以通常喜歡使用 KDE,因此我嘗試了 Ubuntu 的另一個派生版本 Kubuntu,它是基於 KDE 的,在內存使用方面大致介於 Xubuntu 和 Ubuntu 之間。作為參考,清單 9 展示了 Kubuntu 的基本使用水平。

清單 9. Kubuntu 在 256MB 機器上的基本使用水平

kubuntu # free total used free shared buffers cached Mem: 255988 244736 11252 0 7612 160008 -/+ buffers/cache: 77116 178872 Swap: 746980 0 746980

步驟 2:選擇適當的應用程序

選定了發行版之後,接下來的事情是選擇要使用的應用程序組合。不同應用程序的內存需求可能差異很大;有時需要在規模和功能之間進行權衡,但是在另外一些情況下,即使功能相同的應用程序對內存的需求也可能存在巨大差異。

為了度量本文的內存使用情況,我們將使用 exmap 工具。該工具比 ps 或 top 更精確,因為它考慮了多個應用程序使用的共享庫。例如,如果兩個應用程序使用了相同的共享庫,各占 1MB 內存,ps 會顯示這兩個應用程序均額外使用了 1MB 內存,exmap 則能更准確地顯示每個應用程序都只使用了 500 KB 內存。這種精確性對於評價 KDE 和 GNOME 之類的桌面環境非常重要,因為在這些情況下應用程序之間會大量使用共享庫。

對於在下面幾部分討論的每個應用程序,我測量了 exmap 所生成的 resident 和 effective resident 值。resident 值表示進程使用的物理內存總量,包括其他進程使用的共享庫;該值通常與 ps 或 top 輸出的值相同。effective resident 值是將共享庫占用的內存平均分配給各個共享進程得到的;從指定進程所消耗的系統內存角度來看,該值更加精確。

還需要注意,在確定進程的全部內存開銷時,還應該考慮 mapped 和 effective mapped 的值,它是進程中位於交換空間中的那些部分。mapped 值與 resident 值類似,但是它針對交換空間中的頁面,而不是物理內存中的頁面。因此要查看不考慮共享庫時的數據,可以將 resident 和 mapped 值加在一起;要查看考慮對共享庫時的數據,就需要將 effective resident 和 effective mapped 值加在一起。在制作該表時,並沒有 記錄這些值,這是因為對於我們的測試來說,交換空間中並沒有什麼進程,因此,對於這些列,exmap 命令輸出結果的值均為 0。

Web 浏覽器

對於表 1 中的各個浏覽器,均啟動了這個程序,並打開了 developerWorks 主頁,然後等待它們全部顯示出來。結果如表 1 所示。

表 1. Web 浏覽器的內存使用情況比較 應用程序 Effective resident 內存(KB) Resident 內存(KB) Firefox 27708 35068 Opera 20477 27816 Konqueror 13479 29748 Dillo 2776 6888 Lynx 1101 1540

從該表可以看出,這些浏覽器的內存使用情況存在很大差異,內存需求最高的浏覽器(Firefox)使用的內存比需求最低的浏覽器(Lynx)多了大約 27 倍。這並不是非常公平的比較,因為 Lynx 並不能實現同樣的功能(舉例來說,它甚至不能顯示圖形),但這說明,可以根據需求極大地降低內存的使用情況。盡管表 1 中列出的前 3 個浏覽器的功能與第一個浏覽器的功能多少有些相同,但 Opera 使用的內存大約只有 Firefox 的 2/3,Konqueror 使用的內存比 Firefox 少一半。

對於要求不太高的使用需求來說,Dillo 是介於功能完善的浏覽器和只有少量開銷的 Lynx 之間的折中方案。Dillo 提供了一個 GUI;但在默認狀態下其功能相當有限,沒有其他插件時甚至不支持 SSL!

還需要注意我們對共享內存的使用也進行了比較,Konqueror 的執行情況比 Firefox 更好,它使用的內存大約少 14MB;然而,如果查看一下總體使用情況,Konqueror 也仍然高於 Firefox,但差距不大,大約只有 5MB。這是因為 Konqueror 大量地使用了 KDE 共享庫,使用 KDE 桌面時,這些庫被加載到各種應用程序。然而,如果沒有使用任何其他 KDE 應用程序,Opera 將是比 KDE 更佳的選擇。稍後我們將更加詳細地討論這個問題。

文字處理器

為了測試文字處理器,我加載了首次對表 2 中列出的文字處理器進行測試時使用的同一個 Microsoft Word 格式的文檔。

表 2. 文字處理器的內存使用情況比較 應用程序 Effective resident 內存(KB) Resident 內存(KB) OpenOffice Writer 70114 81960 AbiWord 58029 65224 KWord(來自 KOFfice) 46512 60096

從這些數字可以明顯看出,OpenOffice Writer 使用的內存比 KWord 或 AbiWord 都要多。KWord 使用的內存僅次於 OpenOffice,它在正確地顯示 Microsoft Word 格式的文檔方面做得最好。盡管 AbiWord 也可以成功地打開該文檔,但在正確顯示文檔時會遇到一些問題,因此如果對您來說與 Microsoft Office 的協作非常重要,最好選擇 OpenOffice。

即時消息客戶機

為了測試即時消息,我使用表 3 給出的 IM 客戶機分別登錄到 MSN Messenger 帳號中。

表 3. IM 客戶機的內存使用情況比較 應用程序 Effective resident 內存(KB) Resident 內存(KB) aMSN 18455 20344 Gaim 13456 21464 Kopete 10988 24176 KMess 7154 19660

此處,Kmess 最適合我,並且它是合理的選擇,因為我只對連接到 MSN 感興趣。如果需要使用其他服務,那麼 Kopete 似乎是最好的選擇。不過要注意,如果使用不同的 IM 協議,應用程序使用的內存可能會增加;另外,Kmess 是集成的 KDE 應用程序,如果沒有使用 KDE,Gaim 可能更適合您。

分析、選擇並不斷重復

現在您已經了解如何分析應用程序的內存使用情況;可以對自己感興趣的所有應用程序類型簡單地重復這個過程,體驗各種可用選擇,直到找到內存需求最低又能滿足功能需求的選擇為止。

在上面的 Web 浏覽器一節中,您可能會注意到:在使用應用程序時,最節省內存的通常是與桌面環境緊密集成的應用程序。這是因為這些應用程序通常大量使用嵌入到 DE 中的共享庫,並且這些共享庫可能早已加載到系統中。舉例來說,Konqueror 是 KDE 的文件管理器和 Web 浏覽器;因此,它在 KDE 系統上運行時使用的內存明顯少於 Firefox,這是因為它的大部分功能已經通過其他應用程序加載到該系統。類似地,如果希望使用 RSS 聚合器,Akregator 可能是很好的選擇,因為它同樣非常可能使用相同的庫。

因此,如果您注重內存使用情況,則在自己的 系統上執行這些測試非常重要,這是因為很難通過查看他人的基准測試結果來了解哪個應用程序在您的系統上使用的內存較少。

這個事實對於選擇 DE 也有影響。舉例來說,如果真正希望使用 Konqueror,則使用 KDE 作為 DE 可能最為有效。類似地,如果您是 GNOME 用戶,在使用您感興趣的簡短 KDE 應用程序之前需要三思,因為它可能會使用整個主機來加載庫,但只有自己會使用這些庫。

步驟 3:刪除不希望使用的服務和設置

選定發行版、桌面環境和應用程序組合之後,哪些工作還可以降低使用的內存呢?要回答這個問題,需要對系統進行深入挖掘和配置。借助 exmap,可以分析出系統上正在運行的內容,然後嘗試刪除不需要的內容,並按照自己的需要對系統進行配置。

較好的著手點是系統引導時自動啟動的服務,但這樣做需要非常小心,才不至於刪除系統運行時需要的任何內容。需要研究具體的發布版需要哪些內容,以及服務的配置方式,因為各個發行版的這些內容可能有所不同。有些發行版比其他發行版差,因為它默認啟動很多不需要的服務,例如 Web 服務器等,這會占用大量內存。

除了系統服務之外,您可能還希望了解 DE 的配置情況,因為它也可能啟動不需要的服務。

我的 Kubuntu 系統看起來並沒有啟動太多不必要的服務,但是快速查看一下進程列表,就會發現一些明顯能夠刪除的內容:

HPLIP(4.4MB):HP 打印機和掃描器所使用的服務。由於這台機器上並沒有連接此類設備,所以並不需要該服務。 cupsd(1.1MB):打印機後台處理進程。由於這台機器並沒有連接打印機,所以並不需要該服務。 kbluetoothd(3.2MB):KDE Bluetooth 後台處理進程。由於這台機器上並沒有 Bluetooth 連接,所以並不需要該服務。 klipper(1.7MB):KDE 剪切板工具。我沒有考慮使用這個工具,因此將其禁用。 KMix(4.1MB):KDE 音頻合成器。並不是所有時間都需要運行它,因為我通過外部喇叭來調節音量。

只需花 5 分鐘進行配置,就能節省 14MB 左右的內存,與最初大約節省 77MB 相比,這是不錯的著手點。

深入了解您的 DE 和其他大型應用程序的設置非常值得,因為有些設置可能會影響所使用的內存量。舉例來說,通過減少虛擬桌面的個數,也許可以節省一些內存,使用較大的位圖作為背景時尤其如此。關閉一些奇異的顯示特效也可能有所幫助。

步驟 4:期望要適當

在使用舊硬件時,應該考慮到該機器的局限,並正確地進行操作。舉例來說,如果希望編輯一組照片,請不要同時打開所有照片。這樣只會不必要地消耗內存。如果依次打開,並且編輯之後立即將其關閉,就會簡單很多。類似地,如果您正在嘗試捕獲並編輯一些視頻,請考慮單獨捕獲每一個屏幕,而不要一次捕獲所有屏幕;如果正在創建包含圖形展示的大型文檔,則在編輯完文本之前不要添加圖片。

步驟 5:優化系統

最後一個步驟是查看系統中的內存大戶,並找出是否可以從某處節省一些內存。有很多節省內存的機會,但性能就會有所下降,對於大多數人來說,對性能產生的負面影響和所需的工作量,使得這樣做非常不值得。不過,可以考慮下面一些操作:

只使用硬件特有的驅動程序重新編譯內核。大部分主流發行版都適合於大量硬件,因此它們通常支持您沒有使用的很多硬件。這可以產生一定的優勢,盡管以模塊形式存在的硬件支持在不需要時不會加載到系統中。

重新編譯特定的應用程序或庫,這樣就可以對大小進行優化,使其專門用於正在使用的特定 CPU,從而也可以節省一些內存。Gentoo 發行版在這個方面做得非常好,您可以使用自己選擇的確切編譯標記輕松地重新編譯某些或所有系統組件。遺憾的是,這個過程在老機器上執行時可能非常漫長。

刪除應用程序或庫的某些特性,然後對其重新編譯也可以降低一些內存需求。借助 Gentoo 又是很好的主意,因為它包含 USE 標記的概念,允許在禁用應用程序的特性之後,輕松構建系統。這樣可以極大地減少應用程序的大小,應用程序發布時通常都支持大量的文件格式、編碼等,這通常需要加載一些庫來提供實際支持。如果您知道自己永遠都不會閱讀(比如說)JPEG 文件,就可以在 Gentoo 中說明這一點(通過 USE="-jpeg"),這樣任何處理圖形的應用程序編譯後都不支持 JPEG,從而可以降低內存負載。

最近推出的 2.6 內核有一個 swappiness 參數,它可以在運行時進行調優。這個參數決定了,將應用程序移動到交換空間而不是移動到正在減少的高速緩存和緩沖區中的可能性,在前面的測試中可以看到,將應用程序交換出去,而保留大塊物理內存以進行緩存的情況很常見。通過降低交換出去的可能性,緩存可能減少,這樣就可以在內存中保留更多應用程序。但是,這種移動是否真正會使機器運行得更快,取決於正在運行的應用程序。如果在應用程序之間頻繁地換入換出,那麼機器的響應能力可能會提高,因為它們位於內存中的概率增加了;然而,如果有一個任務會執行大量磁盤讀寫操作,這樣做可能速度很慢。通常,降低 swappiness 可以提高交互式應用程序的響應能力,但是會降低系統的總體吞吐量。

結束語

本文的思想可以使您的老機器重新煥發青春(以及其他一些安全性),並在老式硬件上更好地使用 Linux。測量結果顯示,一台 800-MHz/256-MB 的機器可以很好地運行一個相當好用的 Linux 桌面,以滿足輕量級的日常辦公和家用需求,如發送 e-mail、浏覽 Web、文字處理等工作。稍作調整並進行實驗,即使 128MB 的機器也可以成為令人滿意的桌面計算機。

盡管本文重點講述在相當有限的硬件上實現功能良好的桌面,也可以對其他 Linux 應用采用相同的原理。不管最新的超大機器上有多少內存,很快就會發現新應用程序已占滿了這些內存。通過應用這些技術,可以稍微提高過載服務器的性能,並深入了解應用程序的內存使用情況。

原文鏈接:http://www.ibm.com/developerworks/cn/linux/l-linux-memory.Html




Copyright © Linux教程網 All Rights Reserved