在每一個基本的系統中,都包含有各種各樣的基本進程,用於檢查系統服務,和操作系統通信等等。進程和系統的性能表現有著很大的關系,因此,一個系統管理者應該清楚了解當前系統中正在運行什麼東西,有什麼資源可用等等,只有這樣,你才能夠調整配置,例如,禁止不需要的進程,打開必須的監護程序以及將你的內核調整到最優化,最後得到一個最適合自己使用的最好的系統。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:
從這裡,我們就可以看出我的顯卡是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了。