自己動手提高ubuntu系統的性能

在每一個基本的系統中,都包含有各種各樣的基本進程,用於檢查系統服務,和操作系統通信等等。進程和系統的性能表現有着很大的關係,因此,一個系統 管理者應該清楚瞭解當前系統中正在運行什麼東西,有什麼資源可用等等,只有這樣,你才能夠調整配置,例如,禁止不需要的進程,打開必須的監護程序以及將你 的內核調整到最優化,最後得到一個最適合自己使用的最好的系統。Ubuntu是一個爲大衆設計的系統,這也就決定了其系統設置的大衆化,換句話說,臃腫 化。爲了適應兼容性而支持的很多東西,我們其實不一定需要。在這裏,筆者試圖講解一些通過調整內核參數,shell參數以及特定應用的設置來優化系統的方 法,供大家參考。需要注意的是,不同的ubuntu系統有着不同的啓動腳本,並有着不同的運行進程,這裏我只能以7.04系統爲基礎來講解。其實自己學會 對進程進行追蹤查看是非常重要的,只有這樣你才能在不同的系統中都遊刃有餘。另外,如果要更加深入調整系統,那麼自己編譯一個屬於自己的系統是最合適的, 本文沒有牽涉這麼深入的東西。如果你對自己編譯linux系統感興趣,可以參考這篇文章這篇文章

本 文假設你有一點點基本使用linux的基礎,所以很多東西只是講一個概念性的大綱,想深入瞭解的話,網絡上有很多文章。如果你是系統高手,基本就 可以不用看本文了,你會覺得很簡單,如果你是連ps,who -r都不知道的新手,建議你還是先放google搜索一些入門文章,並親自使用linux一週以上,再回過頭來看這篇文章。本文很大程度上參考了Ubuntu Performance Guides,篇幅較長,故分兩頁發出。

基礎知識

理解進程

進程簡介

剛纔就幾次提到進程,那麼,我們應該怎麼理解這個詞語?廣泛得說,所有在系統中運行的,用於執行各種各樣任務的,都是一個進程,只不過根據具體執行任務的不同可以有所區分,例如,用於管理和維持操作系統運行的屬於系統進程,而用於處理用戶需求的就是用戶進程。

進 程並不是一個獨立的概念,它是相互交互的,很多進程都爲其他進程提供服務,或者攜手共同完成某一個功能。這些服務中,有一些對於系統的運作是非常 關鍵的,例如X-Windows服務。絕大多數的系統進程都是服務性質的進程,而絕大多數用戶進程則是應用程序類進程。應用程序,比如你現在在使用的 FireFox(或者其它,估計FF最多吧)通常是由一個或多個滿足用戶需求的進程組成。總的來說,服務的開啓和關閉是基於系統需求的,而應用程序的開啓 和關閉,則是基於用戶的需求的。

我們上面說的這些進程阿,服務阿啥的,其實之間的區分並不是很明顯,舉個例子,Gnome的桌面系統就是由各種程序和進程組成,而他們不僅提供其它程序需要的服務,還可以支持用戶的需求。GDE完全可以被稱爲是程序,進程,應用和服務的集合體,這不會產生任何衝突。

當然,我們還是要稍微做一下區分,後面才方便繼續講解。現在就統一一下,進程表示任何可以產生運行中的進程標誌符的東西,程序則表示能產生進程的可執行文件。用戶能夠直接使用應用程序,而操作系統才使用服務。

進程基本操作

在你的機器上,唯一能夠消耗你資源的就是正在運行的進程。如果當你發現自己的系統突然很慢,運行不正常時,通常只有兩個可能,一種是某些進程運行異常,另一種就是某些進程所消耗的資源已經大於你所擁有的資源。

當然,想看看什麼東西正在你機器上運行其實很簡單,使用ps -aux或者top命令即可,這些東西資料很多,我就不多說了,實在不行man top或者man ps吧。當然,對於初學者來說最方便的還是利用圖形化界面的系統監視器

所有信息都盡顯眼前。注意,在系統監視器中,你不僅能看到進程運行情況,還能看到磁盤使用,CPU使用等很多有價值的信息,這些信息是接下來的部分可能用到的。

ok, 現在我們知道,如果系統異常,如何去確定是什麼進程異常了。但是接下來該怎麼處理呢?無論是命令行還是圖形界面顯示,你都可以看到每一個進程 都有屬於自己的ID,也就是PID。它們都是進程的句柄,而不是表示真實的進程。這有什麼區別?對於一個擁有多線程的進程來講,可以讓所有的線程都擁有同 一個句柄,也可以讓每一個線程都擁有一個句柄。太專業了?恩,通俗來講,這就相當於……進程的身份證,我們通過它來標誌進程。這個東西在ubuntu中默 認可以有32768個不同的PID,每有一個新的進程,就分配一個當前未用的PID給它。

好了,讓我們找到那個讓我們系統變慢的該死的罪魁 禍首,看看它的PID,然後用kill PID命令來關閉它。等等,你確定就是這個進程影響了你的系統?你確信沒有錯殺好人?好吧,其實可以先用kill -stop PID命令來暫停一個進程,看看沒有了它,我們的系統是否正常。如果發現了冤假錯案,沒關係,kill -cont PID能讓進程繼續工作。

除 了直接使用kill PID之外,我們還有更進一步的kill進程的辦法。kill PID僅僅是發出一個TERM信號,然後進程能捕捉這個信號,開始釋放資源,關閉程序,這不是一下子就完成的,因此在關閉程序之前,你可以結束打開的文件 和完成正在做的任務。但是這導致一個問題,假如進程正在進行作業而且不能中斷,那麼進程可以忽略這個SIGTERM信號,而且如果進程失去響應了怎麼辦? 別急,我們還可以試一試kill -1 PID命令,這個命令發送的是hang up信號,含義是“中止信號”,它告訴進程,終端已經被kill了。但這個信號同樣只被運行良好的進程所攔截。假設這兩種方式都無法結束進程,那麼只能使 用kill -9 PID了。這個命令發送的是真正的kill信號,對於這個信號,進程是不能忽略的。 這是一個“我不管您在做什麼,立刻停止”的信號,也就是說進程立刻被終止,不實施清理操作。

信號是用來與守護程序和進程通信的。任何活動任 務都是一個進程,而守護程序是等待對某些事件做出反應或者按照日程安排執行任務的後臺服務。一個程序 必須有建在其中的信號處理程序用於捕獲和應答信號。在LINUX中的signal參考指南解釋了各種不同信號和這些信號的用途。常用的信號除了上面介紹的 以外,還有INT,CHLD等。

進程操作進階

當然,僅僅瞭解上面的知識,對於對進程的理解,還是不夠的。下面,我會介紹更多的關於進程的知識。

首 先,我們需要知道,並不是所有的進程都會被動態分配PID,至少有兩個進程不會,就是kernel和init。kernel進程的PID是0, 一直是0,而且你無法從ps,top這些命令中看見它,當然,也無法用kill命令來終止它。init進程是主父進程,什麼意思呢?每一個進程都需要一個 父進程來監管它,父進程的作用就是接受子進程的返回值和狀態值。而如果任何一個進程的父進程被終止,init就會成爲它的父進程。init進程的PID固 定是1,從理論上講,你也可以終止它,但是千萬不要試圖這樣做,因爲它是用來清除呆死進程的,一旦將其kill,系統最終將崩潰。

除了他倆,還有一些進程是你不應該kill的,包括Zombies,/O Bound—A和Interception。事實上,我們很少解除這幾個進程,普通用戶也沒必要接觸它們,因此,在這裏我不會詳細解釋它們的用途,有興趣的朋友可以自己google。

其 它進程,在保證系統本身不崩潰的情況下,一旦有異常你都可以試圖去kill,不過要知道,kill命令只作用一次,也就是說,假如,我是說假如, 這個進程在被kill後又重新自啓動,那麼你不得不再運行一次kill,這樣循環。當然,此時,你就不能一直陪它kill下去了,追蹤查看其自啓動的根源 纔是正確的做法。你覺得這太麻煩了?好吧,還有一個懶辦法,就是看看這個進程的名字,然後用kill name來阻止它。我知道很多地方都有介紹kill -9 -1這個命令,但是你需要知道,這個命令會kill你所有的進程,包括界面進程以及終端。而且如果你是root權限……它會連所有系統應用都一起 kill,然後,你的系統就將崩潰。所以用這個命令,你還不如直接按下你的重新啓動按鍵,還更加省心……

進程的啓動

我 們能夠查看正在運行的進程,查看進程的具體信息,但是,我們能不能知道它們是怎樣開始的?難道是和孫猴子一樣從石頭裏面崩出來的?你也許會看它的 PPID,恭喜你,摸着點門道了,but……你會發現大多數進程的PPID都是1,init進程。而事實上,進程的啓動原因可能是很多種,啓動腳本,設備 配置腳本,網絡變化,甚至是任務日程等等等等。因此,我們需要探查進程啓動的祕密。

啓動腳本

看看你的/etc/init.d/文件夾,你會發現其中包含了很多用於啓動和停止系統服務的腳本,而它們,都將以鏈接形式存在於/etc/rc0.d, /etc/rc1.d以及類似目錄中。例如,在/etc/rc1.d執行命令ls -l,你會看見如下結果:

lrwxrwxrwx 1 root root 13 2007-04-21 22:01 K01gdm -> ../init.d/gdm*
lrwxrwxrwx 1 root root 17 2007-04-21 21:59 K01usplash -> ../init.d/usplash*
lrwxrwxrwx 1 root root 17 2007-04-23 14:54 K09apache2 -> ../init.d/apache2*
lrwxrwxrwx 1 root root 17 2007-04-21 21:58 K11anacron -> ../init.d/anacron*
lrwxrwxrwx 1 root root 13 2007-04-21 21:58 K11atd -> ../init.d/atd*
lrwxrwxrwx 1 root root 14 2007-04-21 21:58 K11cron -> ../init.d/cron*
lrwxrwxrwx 1 root root 16 2007-04-21 21:59 K19cupsys -> ../init.d/cupsys*
lrwxrwxrwx 1 root root 15 2007-04-21 21:59 K19hplip -> ../init.d/hplip*
lrwxrwxrwx 1 root root 22 2007-04-21 21:58 K20acpi-support -> ../init.d/acpi-su
……………………………..

如果你的運行級別是1,init就會進入/etc/rc1.d並調用其中的鏈接符號,也就是啓動相應的進程,以此類推。如果想知道目前系統的運行級別,最簡單的辦法就是用who -r命令,會顯示:

run-level 2 2007-05-04 10:09

這就表示我目前的系統運行級別是2。在boot的時候,所有/etc/rc2.d目錄下對應的init腳本的輸出都會存到/var/log/messages這個文件中,你可以根據它來判斷哪些進程被執行了。

啓動設備

udev進程用於動態管理設備的配置,這個進程監視和管理即插即用設備。一旦這些設備生效,存在於/etc/udev/rules.d/文件夾下的哪些腳本就會生效,調用不同的應用程序。

shell啓動腳本

每當你登入登出系統,或者是啓動了一個新的shell之後,都會執行配置腳本,每一個腳本都會啓動進程。對於筆者使用的ubuntu而言,默認的shell是bash,相應的配置腳本如下:

/etc/profile:每次登錄shel都會執行,全局配置文件
$HOME/.bash_profile:基於用戶自定義,每一個用戶都可以有自己的登錄腳本
/etc/bash.bashrc:交互式非登錄全局配置腳本,這個文件在.bashrc中會調用
$HOME/.bashrc:交互式非登錄用戶自定義的配置腳本,也是我們大多數時候需要修改的文件
/etc/bash.logout:不一定存在,如果存在的話,每次用戶登出時調用它
$HOME/.bash_logout:同上,只不過是用戶自定義的

我們可以注意到,上面這些腳本大致可以分爲兩類,一類是用於登入登出的,一類是交互式。它們有什麼區別麼?簡單得說,每當你登入你的系統時,登入腳本和交互式腳本都會執行。而當你打開一個終端窗口時,只有交互式腳本纔會被執行。

桌面腳本

linux喊了一萬年的要易用,要佔領桌面系統,簡單說來,就是希望有一個漂亮易用的圖形界面。大多數人的大多數應用還是基於圖形界面的,因此,除了上面介紹的shell腳本,我們還應該關注一下圖形界面腳本。

在 啓動圖形界面的時候,首先會運行/etc/X11/xinit/xinitrc, /etc/X11/Xsession和/etc/X11/xinit/xserverrc這三個腳本。它們會設置相應的環境變量,並在最開始啓動時運行應 用程序。在X-Windows啓動完畢之後,就是Gnome的啓動,它會調用很多程序,產生很多進程,也就是類似於Windwos下的開機自啓動程序。到 底是哪些進程呢?我們可以從存放系統級別啓動腳本的/etc/X11/gdm/目錄,用於用戶自定義啓動程序的$HOME/.gnomerc文件,或者通 過系統>首選項>會話菜單來查看。

好,問題來了。既然有這麼多的地方都能進行開機自啓動程序的添加,難道它們都是完全一樣的麼?這樣有什麼意義呢?

恩,它們當然不是完全一樣的,而是各司其職。

如 果你希望自啓動程序是作用於使用X-Windwos的所有人,那麼你要修改的地方就是/etc/X11/Xsession,或者把腳本放置到 /etc/X11/Xsession.d/目錄下。如果僅僅是希望對你自己使用X-Windwos時生效,則修改$HOME/.xsession即可。

如 果你希望自啓動程序是作用於使用Gnome的所有人,那麼你要修改的地方就是 /etc/X11/gdm/PostSession/Default,它會僅僅對Gnome使用者起作用,而不是KDE使用者或者其他。或者把腳本放置到 /etc/X11/Xsession.d/目錄下。如果僅僅是希望對你自己使用Gnome時生效,則修改$HOME/.gnomerc即可。

小知識:Gnome和X-Windows的區別?
X-Windows是圖形界面底層,提供的功能是在屏幕上構造方塊(窗口),然後畫出裏面的元素,但不提供交互式操作。gnome,kde這些都是基於X -Windows的不同風格的界面,屬於桌面環境。怎麼理解這個桌面環境呢?基本的意思是指“ Mac OS 和 Windows的圖形界面有,而X沒有卻應該有的東西”。通常是一組有着共同外觀和操作感的應用程序,和程序庫,以及創建新的應用程序的方法。事實上你可 以同時有兩個文件管理器,兩個面板,等等,並不衝突,因爲它們都是屬於應用。

 

桌面應用

插入光盤,就會自動彈出文件瀏覽器,插入數碼相機,就會自動彈出照片導入程序,等等。這些應用是怎麼實現的?如何禁止程序的自動執行?如何自定義在即插即用設備被認出以後的啓動程序?
答案就在 系統>首選項>可移動驅動器和介質 裏。打開它,你就明白怎麼回事了,這東西實在太簡單,我就不多說了。 只有一點補充的,就是如果你要使用一款新的即插即用設備,而這種設備在可移動驅動器和介質選項中沒有,那麼此時你就必須於udev了。至於udev的 具體知識,講起來又是一篇文章,所以就不講了,還是那句話,放google~~^_^。

評估資源

剛 才我們一直再說資源資源,當然,系統資源的使用情況直接決定了你係統當前的性能。那麼,我們如何才能對自己系統的性能做一個基礎評估呢?在評估之 前,我們需要對資源做一個更加詳細的解釋。所謂的資源,都是指進程所能使用的資源,包括了CPU處理能力,磁盤空間,磁盤I/O,RAM使用情況,顯存使 用情況,網絡流量等。而這些資源的當前使用狀態,我們都是有辦法自己獲取的。

系統監視器和proc

正 如大多數linuxer所知道的那樣,/proc掛載了一個虛擬文件系統,專門用於列出當前系統資源情況和正在運行的進程。在這裏,所有的東西都 是動態的,隨時可能改變的。最關鍵的是,/proc目錄下有很多以數字命名的文件夾,這些文件夾都對應了某一個響應PID的進程,內含進程的很多信息,包 括使用命令,運行環境等。還有一些不是以數字命名的文件夾,那是設備驅動和內核的情況,例如,cpuinfo這個文件就提供了系統中cpu的相關信息。

當 然,你可能覺得從這裏面獲取系統資源信息實在太麻煩了,你會抱怨,拜託,我僅僅是初學者,有沒有直觀的辦法?sure!剛纔我們說的CPU處理能 力,磁盤可使用空間,內存情況,網絡情況,你統統都可以從系統監視器中看到。監視器以曲線圖的形式把情況呈現在你的面前,你可以根據它評估系統的運行是否 良好,有沒有異常的發生。

其它

那麼,監視器就是萬能的?no,至少顯存和磁盤I/O的情 況它就無法呈現給你。在實際使用中,可能會發生你的系統中有好幾個磁盤,但某個磁盤的 I/O通道堵塞會導致系統性能下降的現象。有什麼辦法來確定是哪個通道在搞鬼呢?這裏,iostat就可以幫助我們了。這是一個小的,評估I/O性能的軟 件,通過sudo apt-get install sysstat來獲得它。安裝完後直接輸入iostat命令,就會顯示:

avg-cpu: %user %nice %system %iowait %steal %idle
7.18 0.08 3.58 2.34 0.00 86.83

Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 16.63 0.19 0.16 1046 877
sdb 0.01 0.00 0.00 0 0

包 括基本CPU負荷以及I/O情況。我機器上磁盤數量較少,所以結果比較少。好了,光知道這些數據是沒用的,我們需要做的是根據這些數據來分析系統 負荷。我們假設現在sdb設備數據量不正常,好,接下來就用mount命令來看看,是哪個文件掛載到sda下的,得出文件路徑名後,用lsof來查看這個 目錄下打開了哪些文件,哪些進程,以及相關信息。這樣,就能有的放矢得來尋找到讓你磁盤I/O情況異常的東西。

之後談談顯存的情況讀取。首 先談談我們爲什麼要關注顯存,顯存的容量會直接影響你的顯示情況,例如,如果你只有一塊老的,256K顯存的顯卡,那麼 屏幕的顯示最高也就是支持到800×600,16位色深。 如今,大部分的高端顯卡都擁有至少128MB的顯存,能夠輕鬆在32位色深的情況下上到1280×1024的分辨率。更多的顯存同樣對遊戲以及桌面的逼真 度有益,因爲可以由顯存的一部分來保持主畫面的顯示,其它空餘下來的顯存就可以用來體現各種層面的仿真元素。我們可以通過lspci –v 命令來顯示所有PCI卡,包括顯卡的存儲關聯情況。這個命令有什麼用呢?當你遇到硬件問題,比如缺乏關鍵的硬件環境支持時,可以用這個命令來診斷到底是什 麼設備出了問題。這個命令在我這裏奏效,但我不保證在所有的機器上都能奏效。在顯示的情況中找VGA這一欄,可以看到顯示信息如下:

01:00.0 VGA compatible controller: ATI Technologies Inc RV370 [Sapphire X550 Silent] (prog-if 00 [VGA])
Flags: bus master, fast devsel, latency 0, IRQ 16
Memory at 20000000 (32-bit, prefetchable) [size=256M]
I/O ports at 2000 [size=256]
Memory at 30110000 (32-bit, non-prefetchable) [size=64K]
Expansion ROM at 30120000 [disabled] [size=128K]
Capabilities: <access></access>

從這裏,我們就可以看出我的顯卡是256M顯存。

實戰演練

在經過上面基礎知識的介紹,就算是超級新手,也大概應該明白一些東西了。好,下面我們就進入實際調整的環節。同樣,所有內容都是基於我的ubuntu feisty系統,如果你的不是這個系統,請仔細覈對後再實踐,我不對任何內容做“肯定可行”的保證。

加快系統啓動速度

剛 才我們已經介紹過了,每次開機啓動的時候,啓動腳本都放在/etc/rc*.d/目錄下,這個*取決於你的運行級別。但是,並不是所有的腳本都是 你目前這個系統需要的。如果把那些你不需要的啓動進程都去除,那麼不僅僅是系統啓動速度會變快,開機後分配給你使用的資源也會增多。

所以現 在,我會告訴你一些常見的可禁止的啓動進程。在此之前,我得提醒各位,對於那些我沒有提及的進程,除非你很清楚知道自己在幹什麼,否則最好不 要去動它們,比如gdm(Gnome桌面)或者module-init-tools(內核模塊)這種,要是誤操作了,系統錯誤可別怪我……

事實上,我們可以通過系統–》管理–》服務的圖形界面來做這種活,但是在這裏,它並沒有列出所有的服務,因此,爲了對所有的啓動進程都能進行自定義,我們選擇sysv-rc-conf工具來進行操作。可以通過

sudo apt-get install sysv-rc-conf

命令來安裝它。然後以root權限打開。

第一行的一排數字表示你的系統運行級別,對應的列就是該級別對應的啓動進程,具體打開和關閉啓動進程的操作方式很簡單,下面就有說明。

好了,介紹一下常見的可以考慮去除的進程吧

* anacron — 這是一個一個自動化運行任務守護進程。你可以把它屏蔽,然後用cron來安排計劃任務。

* atd and cron — 如果你根本就不會使用計劃任務功能,那麼可以連這個也不要。不過它佔用的資源極少,不是特殊情況也沒有必要禁止它。

* apmd — 這是一個電源管理方面的服務,專門用於監視那些不支持ACPI的舊系統的電池。如果你使用的筆記本比較新,或者使用的是臺式機,就沒有必要要它。

* acpid — 這個服務用於監視電池電量,以及那些鍵盤上的特殊功能鍵,比如屏幕亮度調整鍵,音量控制鍵,無線網卡開關等等,也可以監視臺式機鍵盤上一些網絡應用等類似快捷鍵。如果你使用的不是筆記本,也不需要這些快捷鍵,就可以禁止它。

* bluez-utiles — 提供藍牙服務的支持,怎麼操作就取決於你有沒有藍牙設備了。

* dns-clean, ppp, 和pppd-dns — 這些服務用於動態撥號連接。如果你使用的不是撥號,就可以禁止。

* hplip — 提供對HP Linux 圖像和打印系統的支持。建議禁止,因爲就算沒有它,也可以通過lpr這些來實現打印。

* fetchmail - 接受郵件的守護程序,建議關閉。

* nvidia-kernel- ATI顯卡用戶可以關閉,自己編譯顯卡驅動的用戶也可以關閉。

* hwtools - 優化irqs的工具,不用irqs的話就可以關閉

* mdadm, mdadm-raid, and lvm — 用於支持RAID的文件系統和邏輯卷管理(lvm)。如果沒有使用它們,就可以禁止。不過筆者建議在熟悉基本操作後可以自己嘗試學習一些LVM相關的知識,還是挺有意義的。關不關看自己吧。

* nfs-common, nfs-kernel-server, and portmap — NFS(Network File System)是一種分佈式文件系統,允許網絡中的安裝不同操作系統的計算機間共享文件和外設。如果你不是經常需要NFS服務,就可以先禁止它,等要使用 時,再用下面的命令來啓動它們:

sudo /etc/init.d/portmap start
sudo /etc/init.d/nfs-common start
sudo /etc/init.d/nfs-kernel-server start

* pcmcia and pcmciautils — 提供對筆記本上PCMCIA設備的支持。如果沒有PCMCIA插槽,還要它幹嗎?

* powernowd and powernowd.early — 用於控制可變速CPU的服務。現在新的計算機CPU大部分都是可自動變速來節省電量了,所以只有那些很老機器的用戶才建議關閉它。事實上,這部分用戶已經很少很少,所以我個人建議還是保持開啓。

* readahead and readahead - 一般只有內存非常小的用戶,才建議關閉這個啓動進程,因爲它會預加載一些庫,讓一些程序在啓動時更快,這樣會消耗一些內存。如果你內存比較大,就沒有必要管它。

* rsync— 用於在計算機之間同步文件的服務,極少人用到,基本都可以禁止。

* vbesave — rvices monitors the 監視Video BIOS實時配置的服務。它是ACPI的功能之一,通常是筆記本需要在屏幕顯示或者外接顯示(投影儀之類)之間切換時才起作用。如果你的計算機不支持 ACPI或者沒有這種應用的需求,就可以禁止。

調整內核參數

查看參數

不要把內核參數想象得太神祕,事實上,有很多參數是你自己就可以調整的。用下面這個命令在終端中執行試試看,結果是什麼?

sudo sysctl -a | sort | more

是 的,顯示的就是一系列內核參數。即使你不用sudo,也可以看見大多數參數設置。這些顯示的參數都很好理解,比如kernel.threads- max = 16379,就表示同時運行的最大進程數是16379個。也許你會奇怪,PID的最大值不是65536麼?怎麼這個設置小這麼多?是的,這就是我在這裏介 紹調整內核參數的原因。我們完全可以通過調整這個值來適應不同的系統,比如如果你的cpu頻率很低,內存很小,就可以把這個值縮小一些。如果你的cpu很 棒,內存很足,就可以不用管它,甚至調大也行。這完全取決於你的機器配置,和你自己的想法。事實上,在你安裝ubuntu的時候,它就會自動根據可用資源 來調整這個參數,所以不同機器上,這個參數可能是不同的。但是記住,機器調整的畢竟沒有人調整的好,無法最大限度發揮系統的性能。

調整參數

好,我們現在已經可以看到很多內核參數了,那麼,接下來的事情就是根據自己機器的情況來調整。通常有兩種方法來調整參數,一種是在命令行下,通過類似命令

sudo sysctl -w kernel.threads-max=16000

這 樣來調整。這種方法調整過的參數會立刻生效,但是不會永久生效。什麼意思呢?也就是說一旦你重新啓動,所有改動就會消失。那這樣豈不是毫無意義 麼?所以還有第二種方法,就是直接修改/etc/sysctl.conf文件。這個文件本身沒有任何內容,有的東西全部是註釋,就等着你來修改。比如,你 可以將

kernel.threads-max=16000

這行命令加進去,這樣,在重新啓動之後,threads-max的值就會變成16000了。

通常,我們應該配合這兩種辦法來進行內核參數調整。首先用命令行形式調整,看看並測試直觀的效果,如果比較滿意,再把調整寫入文件中。命令行調整的好處就是,不管你怎麼胡亂修改,甚至導致系統錯誤,沒關係,只要重新啓動,一切就將恢復原樣。

修改共享內存

在linux 下,不同的應用程序可以共享同一塊虛擬內存地址,這樣方便不同程序之間的通信和信息共享,通常有兩種共享內存的分配方式:臨時和永久。 臨時分配的意思就是在所有共享的應用程序都釋放內存句柄,不再需要它時,內存就會被收回。而永久分配的意思就是即使沒有任何應用程序使用它,這些共享內存 也會繼續保持,這就有利於將狀態保存於其中。

我們可以通過ipcs命令來查看進程間通信的狀態。輸入ipcs -m來瀏覽內存使用情況,顯示結果爲

—— Shared Memory Segments ——–
key shmid owner perms bytes nattch status
0×00000000 131073 windstorm 600 393216 2 dest
0×00000000 393218 windstorm 600 393216 2 dest
0×00000000 425987 windstorm 600 393216 2 dest
0×00000000 229380 windstorm 600 393216 2 dest
0×00000000 262149 windstorm 600 393216 2 dest
0×00000000 294918 windstorm 600 393216 2 dest
0×00000000 327687 windstorm 600 393216 2 dest
0×00000000 360456 windstorm 600 393216 2 dest
0×00000000 458761 windstorm 600 393216 2 dest
0×00000000 3964938 windstorm 600 393216 2 dest
0×00000000 524299 windstorm 600 393216 2 dest
……..

是不是有點暈了?我們可以看到一些共享內存的信息,包括共享內存ID,所有者,狀態等等,但是這對於普通用戶來說是不夠的。你總得讓我知道是誰在用吧?所以,我們應該使用下面這個命令

ipcs -m -p

來看看輸出結果:

—— Shared Memory Creator/Last-op ——–
shmid owner cpid lpid
131073 windstorm 5473 4790
393218 windstorm 5568 4790
425987 windstorm 5566 4790
229380 windstorm 5413 5513
262149 windstorm 5490 8277
294918 windstorm 5512 4790
327687 windstorm 5496 7300
360456 windstorm 5496 7300
……..

好了,現在我們知道這些共享內存塊分別是誰創建的(cpid),誰最近一次訪問(lpid)。有時候,你會發現一些被遺棄的共享內存,就可以用ipcrm -m|-q|-s shm_id來刪除共享內存信息。

但是通常情況下,如果所用的系統是作爲數據庫或者高性能網絡服務器使用,我們更加關心的是如何分配更多的共享內存,而不是清除廢棄的共享內存。那麼首先,我們可以通過sysctl kernel | grep shm命令看看當前共享內存的分配情況。

sysctl kernel | grep shm

我的機器上果如下:

kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 33554432

這 是什麼意思呢?這些數據表示,當前總共有33,554,432 bytes (32 MB)可用共享內存,每一個單獨的程序最高能夠分配到2,097,152 bytes,也就是2 MB,而最小的分配單元是4096 bytes。這些數據對於常用的應用來說完全足夠了,但是如果是那種類似於數據庫的高性能應用,可能你就需要考慮增大它們的數值了。修改方法?請參考“調 整參數”小節。

ipcs還有很多其他的查看方式,比如ipcs -m –t能夠顯示最近一次共享內存的訪問的時間,ipcs -m –c則可以顯示訪問權限,請man ipcs來自行查閱更多用法。

修改個人用戶設置

在內核設置層面之上,還有很多個人用戶配置的參數,ulimit命令就是bash下提供的,查看對指定應用的限制值的工具。你可以通過ulimit –a命令顯示當前設置:

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) unlimited
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

上面的信息什麼意思?舉個例子,

open files (-n) 1024

表示一個用戶shell最多可以打開1024個文件,想增加怎麼辦?ulimit -n num即可。

core file size (blocks, -c) 0

表示core dumps功能關閉。想打開怎麼辦?ulimit -c num即可。
如果你只是普通身份用戶,則只能對數值進行減少的修改。如果想增加數值,需要用root權限修改。而且,一些參數的上限是和內核參數對應的,比如你可以增 加打開文件句柄的數目,但數目的最大值不能超過內核參數fs.file-max設置的值(sysctl fs.file-max看看)。

修改日誌數據

好吧,我知道這招有些冒險,但是確實很有作用。爲了避免一些朋友在使用後出問題又無法解決,我在後面也附上了問題解決方法。

我們知道,無論是Ext3還是ReiserFS,都有三種日誌方式:
1) Journal Data Writeback
2) Journal Data Ordered
3) Journal Data

三 者的不同點,簡單得說就是實際數據被寫入文件系統以及相關日誌的時間不同。默認系統採用的是Journal Data Ordered方式。如果採用Journal Data Writeback方式,能夠有效提高系統速度,只不過這是有代價的:一旦系統崩潰,在通過日誌恢復後,你可能只能得到一些舊的數據,而不是最新數據。所 以,在修改前,請三思,如果你是對當前工作進度的備份要求非常苛刻的人,最好不要使用這個辦法。

那麼,接下來就介紹一些具體的修改辦法,首先, 如果你是Ext3系統,需要進行以下步驟,否則可能在重新啓動時出錯:

sudo tune2fs -o journal_data_writeback /dev/hda1

這是人工在重啓之前把文件系統設置爲writeback模式。用下面這個命令來確認是否得到了執行:

sudo tune2fs -l /dev/hda1

千萬注意,ReiserFS文件系統不用這樣。

然後sudo vim /etc/fstab,在你的root分區mount屬性中增加

data=writeback

這一句,使其看起來是這樣的:

/dev/hda1 / ext3 defaults,errors=remount-ro,atime,auto,rw,dev,exec,suid,nouser,data=writeback 0 1

保存,然後sudo vim /boot/grub/menu.lst,在下面兩行加上粗體屬性:

# defoptions=quiet splash rootflags=data=writeback
# altoptions=(recovery mode) single rootflags=data=writeback

這樣的話,即使升級內核,增加的標誌也會保持,不會被覆蓋。最後運行sudo update-grub即可。

ok,再提醒一句,這樣做是比較冒險的。我知道你很有冒險心理,所以一旦重新啓動出問題時,請用一下方法解決:
將系統重新啓動到恢復模式下,在命令行下輸入

mount -o remount,rw /dev/sdXX/

這個sdXX就是你的硬盤分區,這樣就允許你修改硬盤上的fstab和menu.lst文件,將改變還原,然後在正確的系統中再去思考到底哪裏出了問題。

雜項

1. 上面已經介紹,/etc/init.d/下面的都是啓動腳本,默認這些腳本是按順序啓動的,實際上,如果你使用的是SATA 或SCSI,可以並行啓動這些腳本程序,加速啓動過程。而如果你的機器配置較老,則最好還是不要修改。修改方法是通過命令

sudo vim /etc/init.d/rc

找到並修改該行:
CONCURRENCY=none
爲:
CONCURRENCY=shell

2. 長期使用 Ubuntu 後有一種感覺,那就是在 GNOME 中啓動應用程序時,速度越來越慢。在 Ubuntu 英文論壇那邊看到一個技巧,可以對這個問題起到改善作用。打開 /etc/hosts 文件,可以看到類似下面的內容:

127.0.0.1 localhost
127.0.1.1 windstorm

現在,只需在第一行的末尾加上主機名即可

127.0.0.1 localhost windstorm
127.0.1.1 windstorm

保存後,重啓系統,更改生效。

3. Pango是一個着重於國際化的,用於輸出和文本渲染的庫,但是這個庫可能導致firefox等一些程序有着過高的cpu佔用資源。我們可以

sudo vim /etc/environment

然後在其中添加:
MOZ_DISABLE_PANGO=”1″

這樣就可以禁用Pango了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章