監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設計管理系統(tǒng) | 簽約案例 | 購買價格 | 在線試用 | 手機APP | 產(chǎn)品資料
X 關(guān)閉

Linux遭遇擴展性問題

申請免費試用、咨詢電話:400-8352-114

文章來源:泛普軟件

使用真正大型機器的樂趣,一方面在于能夠比別人更早在可擴展性方面發(fā)現(xiàn)新的驚奇,所以使用SGI高性能計算機的人常常比我們許多人享有更多的樂趣。他們最近的發(fā)現(xiàn)與內(nèi)核線程的數(shù)量有關(guān): 在4096路系統(tǒng)上,Linux內(nèi)核線程的數(shù)量導致內(nèi)核出現(xiàn)了令人關(guān)注的一些行為。

發(fā)現(xiàn)問題

首先他們發(fā)現(xiàn):即使使用默認的配置,也啟動不了內(nèi)核。Linux系統(tǒng)在任何一個特定的時間,活動進程通常限制在32768個。運行過ps命令的人都會注意到: 內(nèi)核線程在占用數(shù)量越來越多的內(nèi)存插槽。單處理器桌面系統(tǒng)可能在運行其中的39個活動進程。實際上,如今一個典型的系統(tǒng)上有足夠多的內(nèi)核線程,以至這些線程會占滿4096路機器上的全部空間,甚至更多。這個問題比較容易得到解決,只要提高處理器數(shù)量的限額。不過,這樣一來情況變得比較有意思了。

對系統(tǒng)上的其他每個進程(包括內(nèi)核線程)來說,init進程是最終的父進程。所以在大型系統(tǒng)上,init有許多子進程。這些子進程位于一個很大的鏈表(linked list)上。該鏈表由諸多函數(shù)來搜索,其中包括wait()的變種版本。如果正在搜索中的進程接近鏈表末端,那么這個搜索需要花費很長時間。一是因為大多數(shù)內(nèi)核線程是長期線程,二是因為新進程被放在鏈表末端,所以某次搜索很可能確實會尋找末端的某個進程。

然后把某個模塊裝入內(nèi)核。當新模塊進行鏈接時,模塊裝入過程就會調(diào)用stop_machine_run(),該函數(shù)會為系統(tǒng)上的每個進程創(chuàng)建高優(yōu)先級的內(nèi)核線程。該線程就會獲取分配給它的CPU,然后只是閑置在那里,直到被告知退出;盡管所有CPU以這種方式被擱置起來,但鏈接過程照常執(zhí)行。即便在最好的時候(即線程數(shù)量不多的時候),調(diào)用stop_machine_run()這樣的函數(shù)也是有點不合常理,更何況對一個擁有4096路處理器的系統(tǒng)而言,stop_machine_run()會創(chuàng)建4096個線程,每個線程都會進入到init的子鏈表的末端;每個線程等到需要清理時,都必須進行搜索。結(jié)果就是,系統(tǒng)在很長一段時間過后才會停機。

解決辦法

有人可能認為,擁有這么大系統(tǒng)的人根本不應該裝入模塊,但可能會受到來自用戶社區(qū)的反對。所以需要找到其他的解決方案。有關(guān)報告提供了一種簡單的補丁,可以把現(xiàn)有的進程轉(zhuǎn)移到子鏈表的始端。這種變化解決了眼前的問題,因為它可以通過搜索這些子進程就能找到它們,不必遍歷不會去任何地方的所有長期進程。

Linus有幾個變通辦法。辦法之一就是為僵尸進程(zombie process)建立不同的鏈表,從而完全不需要這種搜索。另一個辦法就是停止讓內(nèi)核線程成為init進程的子進程,因為在任何情況下,它們與用戶空間都沒有多大關(guān)系。但一些開發(fā)人員認為,真正的解決方案也許在于開始減少內(nèi)核線程的數(shù)量。

導致內(nèi)核線程大量創(chuàng)建的最主要原因無疑是工作隊列。默認情況下,工作隊列會為系統(tǒng)上的每個CPU創(chuàng)建一個線程。有些情況能夠得益于多個線程和CPU局部性(CPU locality),但毫無疑問也有許多情況下不需要所有這些線程。清除這些線程有助于解決部分擴展性問題; 另一個好處就是,這可以讓ps列表顯得整潔一些。

在許多情況下,工作隊列可能根本沒有必要。相反,內(nèi)核子系統(tǒng)可能完全使用“一般的”keventd工作隊列(作為events/n線程來運行)。使用keventd內(nèi)核線程存在一些問題,包括無限制延遲以及可能性很小的死鎖,不過在許多情況下,它的工作效果足夠好。

在其他情況下,使用線程很有必要。涉及長時間延遲的任務是一個例子; 使用kevented運行延遲時間好幾秒的函數(shù)被認為是不恰當?shù)?。需要復雜上下文的工作也會得益于其自己的線程。不過在許多情況下,這些線程在一些工作實際完成之前并不需要創(chuàng)建。大多數(shù)系統(tǒng)上迅速運行ps命令可以顯示與錯誤處理、異步I/O、藍牙及更多方面有關(guān)的線程。按照當前方式,這些線程在啟動時(或者模塊裝入時)創(chuàng)建,其中許多線程在系統(tǒng)關(guān)閉之前可能根本不做任何實際工作。創(chuàng)建線程的成本很低,所以許多這些線程可以在需要時創(chuàng)建而成。

這方面恐怕需要進行一些真正的改進。需要的只是有人、有時間、有動力來做這項工作。與此同時,使用4096路處理器系統(tǒng)的人可能需要打上一兩個補丁。

鏈接:進程與線程

可執(zhí)行文件由指令和數(shù)據(jù)組成。進程就是在計算機上運行的可執(zhí)行文件針對特定的輸入數(shù)據(jù)的一個實例,同一個可執(zhí)行程序文件如果操作不同的輸入數(shù)據(jù)就是兩個不同的進程。

線程是進程的一條執(zhí)行路徑,它包含獨立的堆棧和CPU寄存器狀態(tài),每個線程共享其所附屬的進程的所有的資源,包括打開的文件、頁表(因此也就共享整個用戶態(tài)地址空間)、信號標識及動態(tài)分配的內(nèi)存等等。線程和進程的關(guān)系是:線程是屬于進程的,線程運行在進程空間內(nèi),同一進程所產(chǎn)生的線程共享同一物理內(nèi)存空間,當進程退出時該進程所產(chǎn)生的線程都會被強制退出并清除。

Linux內(nèi)核只提供了輕量進程的支持,限制了更高效的線程模型的實現(xiàn),但Linux著重優(yōu)化了進程的調(diào)度開銷,一定程度上也彌補了這一缺陷。目前最流行的線程機制LinuxThreads所采用的就是線程-進程“一對一”模型,調(diào)度交給核心,而在用戶級實現(xiàn)一個包括信號處理在內(nèi)的線程管理機制。

在Linux的“一對一”模型中,用一個核心進程(輕量進程)對應一個線程,將線程調(diào)度等同于進程調(diào)度,交給核心完成,而其他諸如線程取消、線程間的同步等工作,都是在核外線程庫中完成的。因此可以把進程看作一組線程,這組線程擁有相同的線程組號(TGID),這個TGID就是這組線程序所附屬的進程的ID號,每個線程的ID號就是我們用ps命令所看到的LWP號。(ccw)
 

發(fā)布:2007-04-22 09:57    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
南昌OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務大廈18樓

咨詢:400-8352-114

加微信,免費獲取試用系統(tǒng)

QQ在線咨詢

泛普南昌OA信息化其他應用

南昌OA軟件 南昌OA新聞動態(tài) 南昌OA信息化 南昌OA快博 南昌OA行業(yè)資訊 南昌軟件開發(fā)公司 南昌門禁系統(tǒng) 南昌物業(yè)管理軟件 南昌倉庫管理軟件 南昌餐飲管理軟件 南昌網(wǎng)站建設公司