Apache 性能最優(yōu)化分析(7)_Windows教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
有兩種實現(xiàn)這個特性的辦法:一是socket的SO_LINGER選項。但似乎是命中注定,在多數(shù)TCP/IP協(xié)議棧中它從來不能正確地實現(xiàn)。即使是在提供了正確實現(xiàn)的平臺(即Linux 2.0.31)上,這種方法也要比第二種方法代價(指CPU時間)高得多。
大多數(shù)情況下,Apache在一個叫l(wèi)ingering_close的函數(shù)中實現(xiàn)了它(在 http_main.c)。這個函數(shù)大致如下所示:
void lingering_close (int s)
{
char junk_buffer[2048];
/* shutdown the sending side */
shutdown (s, 1);
signal (SIGALRM, lingering_death);
alarm (30);
for (;;) {
select (s for reading, 2 second timeout);
if (error) break;
if (s is ready for reading) {
read (s, junk_buffer, sizeof (junk_buffer));
/* just toss away whatever is here */
}
}
close (s);
}
這自然增加了連接結(jié)束時的開銷,但它是可靠的實現(xiàn)所必需的。隨著HTTP/1.1的日益盛行,所有連接都是持久的,這種開銷將被眾多的連接請求抵消。如果您想冒險禁止這一特性的話,可以定義宏NO_LINGCLOSE,但這顯然是不被推薦的。實際上,由于在HTTP/1.0中持久的管道式連接越來越普遍,lingering_close幾乎是必須的選擇。(管道式連接非常高效,所以您還是希望支持它的吧)
5) 記分板文件
Apache利用一種叫做記分板(scoreboard)的技術在父、子進程間通訊。它的理想實現(xiàn)是在共享內(nèi)存中。有的操作系統(tǒng)允許我們直接訪問共享內(nèi)存,或者提供它們的確切端口。在這些系統(tǒng)中的典型實現(xiàn)就是共享內(nèi)存記分板。其他的系統(tǒng)則將磁盤上的文件作為缺省實現(xiàn)。磁盤文件不僅低效而且不穩(wěn)定(又沒有什么優(yōu)勢)。請為您的操作系統(tǒng)仔細閱讀src/main/conf.h文件,并在其中尋找USE_MMAP_SCOREBOARD或者USE_SHMGET_SCOREBOARD。定義它們之一(以及相應的HAVE_MMAP和HAVE_SHMGET)將允許Apache使用共享內(nèi)存。如果您系統(tǒng)的內(nèi)存共享機制與眾不同,請編輯src/main/http_main.c并增加Apache所需的掛鉤函數(shù)(同時請把補丁寄給我們)
注:直到1.2版,Apache的Linux版才開始使用共享內(nèi)存。這一疏忽使得以前版本的Apache在Linux上表現(xiàn)得很不理想。
DYNAMIC_MODULE_LIMIT
如果您不打算支持動態(tài)加載模塊的話(準備榨出最后一滴性能的您可能希望如此),編譯服務器時請設定參數(shù)-DDYNAMIC_MODULE_LIMIT=0。這將節(jié)省出為動態(tài)加載模塊而分配的內(nèi)存。
大多數(shù)情況下,Apache在一個叫l(wèi)ingering_close的函數(shù)中實現(xiàn)了它(在 http_main.c)。這個函數(shù)大致如下所示:
void lingering_close (int s)
{
char junk_buffer[2048];
/* shutdown the sending side */
shutdown (s, 1);
signal (SIGALRM, lingering_death);
alarm (30);
for (;;) {
select (s for reading, 2 second timeout);
if (error) break;
if (s is ready for reading) {
read (s, junk_buffer, sizeof (junk_buffer));
/* just toss away whatever is here */
}
}
close (s);
}
這自然增加了連接結(jié)束時的開銷,但它是可靠的實現(xiàn)所必需的。隨著HTTP/1.1的日益盛行,所有連接都是持久的,這種開銷將被眾多的連接請求抵消。如果您想冒險禁止這一特性的話,可以定義宏NO_LINGCLOSE,但這顯然是不被推薦的。實際上,由于在HTTP/1.0中持久的管道式連接越來越普遍,lingering_close幾乎是必須的選擇。(管道式連接非常高效,所以您還是希望支持它的吧)
5) 記分板文件
Apache利用一種叫做記分板(scoreboard)的技術在父、子進程間通訊。它的理想實現(xiàn)是在共享內(nèi)存中。有的操作系統(tǒng)允許我們直接訪問共享內(nèi)存,或者提供它們的確切端口。在這些系統(tǒng)中的典型實現(xiàn)就是共享內(nèi)存記分板。其他的系統(tǒng)則將磁盤上的文件作為缺省實現(xiàn)。磁盤文件不僅低效而且不穩(wěn)定(又沒有什么優(yōu)勢)。請為您的操作系統(tǒng)仔細閱讀src/main/conf.h文件,并在其中尋找USE_MMAP_SCOREBOARD或者USE_SHMGET_SCOREBOARD。定義它們之一(以及相應的HAVE_MMAP和HAVE_SHMGET)將允許Apache使用共享內(nèi)存。如果您系統(tǒng)的內(nèi)存共享機制與眾不同,請編輯src/main/http_main.c并增加Apache所需的掛鉤函數(shù)(同時請把補丁寄給我們)
注:直到1.2版,Apache的Linux版才開始使用共享內(nèi)存。這一疏忽使得以前版本的Apache在Linux上表現(xiàn)得很不理想。
DYNAMIC_MODULE_LIMIT
如果您不打算支持動態(tài)加載模塊的話(準備榨出最后一滴性能的您可能希望如此),編譯服務器時請設定參數(shù)-DDYNAMIC_MODULE_LIMIT=0。這將節(jié)省出為動態(tài)加載模塊而分配的內(nèi)存。
相關Windows教程:
- 相關鏈接:
- 教程說明:
Windows教程-Apache 性能最優(yōu)化分析(7)。