Linux常見技術支持問題十一則
1.我想要讓Apache為大量的連接提供服務。為了減小創建進程所需要的時間,我把Apache子進程數量配置為固定的1000。系統的性能很差,有時甚至拒絕連接。你有什么建議嗎?
本文引用地址:http://www.104case.com/article/201609/303835.htm解答:看來你很可能遇到了一個通常稱為“thundering herd”(異乎尋常地聚集)的問題。Apache和Linux的文檔都詳細地說明了這個問題,你可以用幾種方法來解決它。
在Linux中,這種情形通常從進程“wake”(喚醒)發展而來。當一個新到達的連接要求Apache/Linux提供服務時,系統向所有正在休眠的進程發出通知。這時,所有這些進程會試圖獲得對新連接的控制權。但是,它們之中只有一個能夠獲得成功,所有其他進程都將失敗并轉入休眠狀態。這被稱為“wake all”(全部喚醒)。Linux 2.2和更早的內核都按照這種方式進行處理。
當正在休眠的Apache進程比較少時,它不會成為問題。通常,Apache會利用httpd.conf中的MinSpareServers和MaxSpareServers配置變量調整休眠進程的數量。然而,如果MaxSpareServer值高得異乎尋常,那么它可能導致性能問題。我通常把MaxSpareServer值設置為MaxClients值的百分之五到十之間。
如果你的MaxSpareServers值高得異乎尋常,只要減小這個值就可以立即提高性能。
一些內核不會遇到這個問題,因為它們具有一種利用“wake one”(喚醒一個)的能力,“wake one”允許為每個連接請求喚醒一個進程。BSD具有這個能力,Linux 2.4內核也一樣。
為了利用“wake one”能力,編譯Apache的時候必須指定一個特殊的選項。如果為2.4內核配置Apache,在編譯之前請按照下面的示例執行命令,它將改善具有“wake one”能力的內核的性能:
# CFLAGS='-DSINGLE_LISTEN_UNSERIALIZED_ACCEPT' ./configure
為給數量巨大的網絡連接提供服務,Apache提供了許多調整參數。Apache有一個固定的最大允許連接數量限制,如果要把它設置成大于256,你必須重新編譯Apache。
另外,為了適應大規模服務的要求,Linux也需要進行一些文件系統方面的調整。你還要檢查一下Linux通過編譯方式固定的進程、系統級、用戶級限制。
簡而言之,當你為了巨大的Apache進程/連接數量而進行調整時,有大量的因素必須考慮。“thundering herd”也許是被忽視最多的問題,但其它需要考慮的因素還有很多。
欲知更多為了提高連接數量而調整Apache的信息,請訪問http://linuxperf.nl.linux.org/webserving。
2.我得到了一個服務器上的帳號。由于管理員推薦使用ssh,這個帳號被禁止使用telnet和ftp。什么是ssh?如何使用?他們為什么要禁用telnet?
解答:ssh是“secure shell”的簡稱,它完全可以替代telnet。ssh也有一個文件復制命令,即scp(安全拷貝),利用這個命令可以在不同的機器之間移動文件。
由于telnet和ftp的設計不是很安全,許多管理員禁用了telnet和ftp。用telnet和ftp協議登錄服務器時,密碼以明文的形式發送給服務器,懷有惡意的人可能監聽網絡上傳輸的數據包,進而得到用戶的登錄信息。雖然發生這種事情的可能性不大,但如果使用象ssh之類的協議,我們可以完全防止這類事情發生。
在使用方法上,ssh和telnet很相似。然而,ssh不僅加密登錄名字和密碼,而且加密整個傳輸過程。因此,ssh能夠防止任何在你和服務器之間的第三者看到傳輸內容。
有一個廣受歡迎的免費ssh實現,它屬于OpenBSD系統,但也可以在Linux上運行。OpenSSh可以從http://ftp.openbsd.org/pub/OpenBSD/OpenSSH下載。如果你的系統以rpm包為基礎,你可以在portable/rpm目錄下找到rpm包。(直到最近,OpenSSH所用的加密算法之一還有專利限制。但現在情況已經有了變化。請參見http://www.rsasecurity.com/developers/total-solution)。
安裝好ssh之后,我們可以很方便地在遠程服務器上利用ssh獲得一個shell。例如,假設我執行:
# ssh dtype@trove.sourceforge.net
首先我看到系統提示輸入密碼,輸入后我就在遠程機器上獲得了一個shell。從這里開始,ssh的會話過程和telnet會話相似。不同之處在于,我能夠確信所有在我和服務器之間傳輸的數據都已經經過加密。
如果你很熟悉rsh和它的選項,那么你很快就可以開始使用ssh。ssh被設計成和rsh具有相同的運作方式。一般情況下,能夠用rsh作為傳輸端口的程序都允許用ssh來替代(例如rsync)。
安全復制命令scp的用法也很簡單,它的語法和cp的語法很相似。例如,要把index.php文件復制到dtype.org服務器,則我們使用如下命令:
# scp index.php dtype@dtype.org:/usr/local/apache/htdocs/
此時,我們將看到密碼輸入提示(正如ssh)。接下來,本地機器當前目錄下的index.php文件被復制到dtype.org的/usr/local/apache/htdocs/,使用的登錄名字是dtype。
要了解有關OpenSSh的更多信息,請參見http://www.openssh.com,從這里你可以找到有關安全協議的詳細說明。
3.我有一臺便攜計算機。我想要保證便攜機和臺式機上都有最新的數據文件。你有何建議?
解答:有一個優秀的工具rsync能夠完成這個任務。rsync提供了一種保持兩組文件相同的方法。它以Andrew Tridgell(SAMBA項目的創始人)設計的算法為基礎。Andrew Tridgell的算法允許只傳輸對文件的改動。
rsync一般被看成是一個標準的系統工具,因此你的系統上很可能已經安裝了rsync。如果它還沒有安裝,那么你的Linux安裝盤上應該有它的包文件,或者你也可以從http://rsync.samba.org下載最新的源代碼。在命令行直接輸入rsync將提示用法說明,你可以用這種方法測試rsync是否已經安裝。
要保持文件同步,所有機器(在本例中,這是指你的便攜計算機和臺式機)都必須安裝rsync。另外,這兩臺機器應該能夠通過網絡互相看到對方。
我強烈建議用ssh作為兩臺機器之間的通信機制。但還有其他幾種配置rsync傳輸器的方法,包括rsh和rsync daemon模式,rsync文檔對此有詳細說明。請參見本文有關ssh的說明了解更多信息。
rsync命令的語法和cp命令很相似。從本質上看,你是在把文件從一個位置復制到另一個位置,但rsync多了幾個cp命令沒有的選項。和通常的文件復制相比,文件同步最大的不同之處是你必須指定一臺非本地的機器(比如你的臺式機)。
評論