Nginx使用教程(三):Nginx配置性能優化之I/O和TCP配置


配置Nginx I/O

<br\>

Sendfile

當應用程序傳輸文件時,內核首先緩沖數據,然后將數據發送到應用程序緩沖區。 應用程序反過來將數據發送到目的地。 Sendfile方法是一種改進的數據傳輸方法,其中數據在操作系統內核空間內的文件描述符之間復制,而不將數據傳輸到應用程序緩沖區。 這使操作系統資源的利用率提高。
可以使用sendfile指令啟用該方法。 該指令可用於http,server和location代碼塊:

  1. http{
  2.      sendfile on;
  3. }

此指令默認為off。

直接I/O

操作系統內核通常嘗試優化和緩存任何讀/寫請求。 由於數據在內核中緩存,對同一位置的任何后續讀取請求將更快,因為不需要再從磁盤讀取信息。
直接I/O是文件系統的一個功能,其從應用程序到磁盤直接讀取和寫入,從而繞過所有操作系統緩存。 這使得更好地利用CPU周期和提高緩存效率。
該方法用於數據具有較差命中率的地方。 這樣的數據不需要在任何高速緩存中,並且可以在需要時加載。 它可以用於提供大文件。 directio指令啟用該功能。 該指令可用於http,server和location區塊:

  1. location /video/ {
  2.      directio 4m;
  3. }

任何大於指令中指定的文件將由直接I/O加載。 其它情況下禁用此參數。
直接I/O取決於執行數據傳輸時的塊大小。 NGINX有directio_alignment指令來設置塊大小。 該指令可用於http,server和location區塊:

  1. location /video/ {
  2.      directio 4m;
  3.      directio_alignment 512;
  4. }

除了XFS文件系統,默認值512字節在所有Linux版本運行良好。在此文件系統下,大小應增加到4 KB。

異步I/O

異步I/O允許進程進行不受阻塞或不需要等待I/O完成的I/O操作。
aio命令可在NGINX配置的http,server和location區塊下使用。 根據在指令所在區塊,該指令將為匹配的請求執行異步I/O。 該參數適用於Linux內核2.6.22+和FreeBSD 4.3。 如下代碼:

  1. location /data {
  2.      aio on;
  3. }

默認情況下,該參數設置為off。 在Linux上,aio需要啟用direction,而在FreeBSD上,sendfile需要禁用以使aio生效。
該指令具有特殊的線程值,可以為發送和讀操作啟用多線程。 多線程支持僅在Linux平台上可用,並且只能與處理請求的epoll,kqueue或eventport方法一起使用。
為了使用線程值,在編譯Nginx時使用–with-threads選項配置多線程支持。 在NGINX全局上下文中使用thread_pool指令添加一個線程池。 在aio配置中使用該線程池:

  1. thread_pool io_pool threads=16;
  2.    http{
  3.    ........
  4.       location /data{
  5.         sendfile    on;
  6.         aio        threads=io_pool;
  7. } }

配置Nginx TCP

<br\>
HTTP是一種基於應用的協議,它使用TCP作為傳輸層。 在TCP中,數據以稱為TCP分組的塊的形式傳送。 NGINX提供了改變底層TCP棧的行為的指令。 這些參數更改了單個套接字連接的屬性。

TCP_NODELAY

TCP/IP網絡存在“小包”問題,其中單字符消息可能在高負載網絡上導致網絡擁塞。 例如分組大小為41字節,其中40字節用於TCP報頭,只有1字節是有用信息。 這些小包占用了大約4000%的巨大開銷並且使得網絡飽和。
ohn Nagle通過不立即發送小包來解決問題(Nagle的算法)。 所有這樣的分組被收集一定量的時間,然后作為單個分組一次發送。 這改進了底層網絡的的效率。 因此,典型的TCP/IP協議棧在將數據包發送到客戶端之前需要等待200毫秒。
在打開套接字時可以使用TCP_NODELAY選項來禁用Nagle的緩沖算法,並在數據可用時立即發送。 NGINX提供了tcp_nodelay指令來啟用此選項。 該指令可用於http,server和location區塊:

  1. http{
  2.      tcp_nodelay on;
  3. }

該指令默認情況下啟用。

TCP_CORK

作為Nagle算法的替代方案,Linux提供了TCP_CORK選項。 該選項告訴TCP堆棧附加數據包,並在它們已滿或當應用程序通過顯式刪除TCP_CORK指示發送數據包時發送它們。 這使得發送的數據分組是最優量,並且因此提高了網絡的效率。
NGINX提供了tcp_nopush指令,在連接套接字時啟用TCP_CORK。 該指令可用於http,server和location區塊:

  1. http{
  2.      tcp_nopush on;
  3. }

該指令默認情況下禁用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM