Nginx使用教程(三):Nginx配置性能優(yōu)化之I/O和TCP配置
2017-03-01 00:02:45
11274
Nginx使用教程(三):Nginx配置性能優(yōu)化之I/O和TCP配置
配置Nginx I/O
Sendfile
當(dāng)應(yīng)用程序傳輸文件時(shí),內(nèi)核首先緩沖數(shù)據(jù),然后將數(shù)據(jù)發(fā)送到應(yīng)用程序緩沖區(qū)。 應(yīng)用程序反過(guò)來(lái)將數(shù)據(jù)發(fā)送到目的地。 Sendfile方法是一種改進(jìn)的數(shù)據(jù)傳輸方法,其中數(shù)據(jù)在操作系統(tǒng)內(nèi)核空間內(nèi)的文件描述符之間復(fù)制,而不將數(shù)據(jù)傳輸?shù)綉?yīng)用程序緩沖區(qū)。 這使操作系統(tǒng)資源的利用率提高。
可以使用sendfile指令啟用該方法。 該指令可用于http,server和location代碼塊:
http{
sendfile on;
}
此指令默認(rèn)為off。
直接I/O
操作系統(tǒng)內(nèi)核通常嘗試優(yōu)化和緩存任何讀/寫(xiě)請(qǐng)求。 由于數(shù)據(jù)在內(nèi)核中緩存,對(duì)同一位置的任何后續(xù)讀取請(qǐng)求將更快,因?yàn)椴恍枰購(gòu)拇疟P(pán)讀取信息。
直接I/O是文件系統(tǒng)的一個(gè)功能,其從應(yīng)用程序到磁盤(pán)直接讀取和寫(xiě)入,從而繞過(guò)所有操作系統(tǒng)緩存。 這使得更好地利用CPU周期和提高緩存效率。
該方法用于數(shù)據(jù)具有較差命中率的地方。 這樣的數(shù)據(jù)不需要在任何高速緩存中,并且可以在需要時(shí)加載。 它可以用于提供大文件。 directio指令啟用該功能。 該指令可用于http,server和location區(qū)塊:
location /video/ {
directio 4m;
}
任何大于指令中指定的文件將由直接I/O加載。 其它情況下禁用此參數(shù)。
直接I/O取決于執(zhí)行數(shù)據(jù)傳輸時(shí)的塊大小。 NGINX有directio_alignment指令來(lái)設(shè)置塊大小。 該指令可用于http,server和location區(qū)塊:
location /video/ {
directio 4m;
directio_alignment 512;
}
除了XFS文件系統(tǒng),默認(rèn)值512字節(jié)在所有Linux版本運(yùn)行良好。在此文件系統(tǒng)下,大小應(yīng)增加到4 KB。
異步I/O
異步I/O允許進(jìn)程進(jìn)行不受阻塞或不需要等待I/O完成的I/O操作。
aio命令可在NGINX配置的http,server和location區(qū)塊下使用。 根據(jù)在指令所在區(qū)塊,該指令將為匹配的請(qǐng)求執(zhí)行異步I/O。 該參數(shù)適用于Linux內(nèi)核2.6.22+和FreeBSD 4.3。 如下代碼:
location /data {
aio on;
}
默認(rèn)情況下,該參數(shù)設(shè)置為off。 在Linux上,aio需要啟用direction,而在FreeBSD上,sendfile需要禁用以使aio生效。
該指令具有特殊的線程值,可以為發(fā)送和讀操作啟用多線程。 多線程支持僅在Linux平臺(tái)上可用,并且只能與處理請(qǐng)求的epoll,kqueue或eventport方法一起使用。
為了使?線程值,在編譯Nginx時(shí)使用–with-threads選項(xiàng)配置多線程支持。 在NGINX全局上下文中使用thread_pool指令添加一個(gè)線程池。 在aio配置中使用該線程池:
thread_pool io_pool threads=16;
http{
........
location /data{
sendfile on;
aio threads=io_pool;
} }
配置Nginx TCP
HTTP是一種基于應(yīng)用的協(xié)議,它使用TCP作為傳輸層。 在TCP中,數(shù)據(jù)以稱(chēng)為T(mén)CP分組的塊的形式傳送。 NGINX提供了改變底層TCP棧的行為的指令。 這些參數(shù)更改了單個(gè)套接字連接的屬性。
TCP_NODELAY
TCP/IP網(wǎng)絡(luò)存在“小包”問(wèn)題,其中單字符消息可能在高負(fù)載網(wǎng)絡(luò)上導(dǎo)致網(wǎng)絡(luò)擁塞。 例如分組大小為41字節(jié),其中40字節(jié)用于TCP報(bào)頭,只有1字節(jié)是有用信息。 這些小包占用了大約4000%的巨大開(kāi)銷(xiāo)并且使得網(wǎng)絡(luò)飽和。
ohn Nagle通過(guò)不立即發(fā)送小包來(lái)解決問(wèn)題(Nagle的算法)。 所有這樣的分組被收集一定量的時(shí)間,然后作為單個(gè)分組一次發(fā)送。 這改進(jìn)了底層網(wǎng)絡(luò)的的效率。 因此,典型的TCP/IP協(xié)議棧在將數(shù)據(jù)包發(fā)送到客戶(hù)端之前需要等待200毫秒。
在打開(kāi)套接字時(shí)可以使用TCP_NODELAY選項(xiàng)來(lái)禁用Nagle的緩沖算法,并在數(shù)據(jù)可用時(shí)立即發(fā)送。 NGINX提供了tcp_nodelay指令來(lái)啟用此選項(xiàng)。 該指令可用于http,server和location區(qū)塊:
http{
tcp_nodelay on;
}
該指令默認(rèn)情況下啟用。
TCP_CORK
作為Nagle算法的替代方案,Linux提供了TCP_CORK選項(xiàng)。 該選項(xiàng)告訴TCP堆棧附加數(shù)據(jù)包,并在它們已滿或當(dāng)應(yīng)用程序通過(guò)顯式刪除TCP_CORK指示發(fā)送數(shù)據(jù)包時(shí)發(fā)送它們。 使得發(fā)送的數(shù)據(jù)分組是最優(yōu)量,并且因此提高了網(wǎng)絡(luò)的效率。
NGINX提供了tcp_nopush指令,在連接套接字時(shí)啟用TCP_CORK。 該指令可用于http,server和location區(qū)塊:
http{
tcp_nopush on;
}
該指令默認(rèn)情況下禁用。
會(huì)員登錄
賬號(hào)登錄還沒(méi)有賬號(hào)?立即注冊(cè)