2012-06-28 20 views
6

我打算構建大文件服務器,並且需要堆棧溢出社區對文件系統選擇(linux)的建議。在適度寫入下使用nginx服務1GB文件的最佳文件系統,讀取性能明智?

文件服務器將服務1-2GB大小的靜態文件的Nginx通過(主要是每個請求不同)下,在恆定中等寫入磁盤(RAID5 SATA/7200磁盤大規模)。寫入讀取比率約爲1:5-10,每寫入1個字節每秒,讀取5-10個。 對我來說最重要的是讀取性能,我可以忍受較慢的寫入。

什麼Linux文件系統將是這個任務的最佳解決方案?爲什麼:)謝謝!

回答

0

非常大的文件往往不是非常依賴於您所使用的文件系統,現代文件系統(即不胖!)做存儲的大型連續塊分配它們,從而減少尋道延遲的一個很好的工作。如果你傾向於看到它們之間的差異在於小文件性能,在空間不足情況下的分裂阻力,併發性等等。存儲大文件是一個相對容易的問題,我懷疑你會看到可衡量的差異。

但一如既往:如果你真的關心,基準。關於文件系統性能沒有簡單的答案。

+0

所以沒有真正:(你有沒有試過刪除上ext2-3大文件VS XFS VS JFS?還有,看看內核源代碼就已經透露給你,不同的FS司機花不同時間的臨界部分,他們往往在高IO壓力下表現出不同的表現。 –

+0

刪除大文件不是用例。如果你有號碼,給他們看。我支持我寫的內容。 –

+0

數字? 「有謊言,該死的謊言,然後基準」我還沒有看到沒有任何營銷目標的基準。我在談論我的經驗和公開的Linux內核源碼。然而,「我懷疑你會看到可衡量的差異」這一點是荒謬的。 –

4

爲用戶提供服務重內容最好的結果,有調別的東西。請通過下面Nginx core developer's comment看一看:

  1. 切斷的sendfile,它可以在linux下 此類工作負載不好,由於沒有能力控制預讀(從 磁盤讀取,因此塊)。

    sendfile off;

  2. 使用大輸出緩衝器

    output_buffers 1 512K

  3. 嘗試使用AIO,以確保更好的磁盤併發(下 Linux的,它需要的directio以及注),即是這樣的

    aio on; directio 512;

其他建議:

  1. 檢查文件系統交換,不使用

  2. 文件系統 - EXT4,XFS。很好地啓用data_writeback和noatime安裝選項

5

我實現了每「真實」磁盤(主軸)「隨機讀取」性能80MB/s。 這是我的發現。

因此,首先決定你需要多少流量向下推至用戶,有多少存儲你每臺服務器需要。

由於您已經有RAID5設置,您可以跳過下面給出的磁盤設置建議。

讓我們舉一個帶有3 * 2TB磁盤的專用1Gbps帶寬服務器的例子。 保留專用於OS和tmp的第一張磁盤。對於其他2個磁盤,你可以創建一個軟件RAID(對我來說,它比板載硬件RAID更好)。否則,你需要在獨立的磁盤上平分你的文件。想法是保持兩個磁盤共享讀/寫負載平等。軟件raid-0是最好的選擇。

的Nginx的conf 有兩種方法來實現使用nginx的性能高的水平。

  1. 使用上的directio

    AIO;
    directio 512; output_buffers 1 8m;

    「這個選項需要你有大量內存」 需要大約12-16GB的ram。

  2. 用戶級的IO

    output_buffers 1個2M;

    「請確保您已設置預讀以4-6MB軟件RAID安裝」 blockdev看看-setra 4096的/ dev/md0的(或獨立磁盤安裝)

    此設置將優化使用系統文件緩存,並需要更少的內存。 需要8GB左右的內存。

共同注:

  • 保持 「SENDFILE關閉;」

您可能還想使用帶寬限制來啓用可用帶寬上的100個連接。每個下載連接將使用4MB的活動RAM。

 limit_rate_after 2m; 
     limit_rate 100k; 

兩個上述溶液將縮放3磁盤服務器上容易到1 k +同時發生的用戶。 假設您有1Gbps的帶寬,並且每個連接都以1Mb/ps的速度進行節流 需要額外的設置來優化磁盤寫入而不會影響讀取量。

使所有上傳到mount os/tmpuploads上的主os磁盤。這將確保沒有間歇性干擾,而重讀正在進行。然後使用「dd」命令將文件從/ tmpuploads移至withlag = direct。像

dd if=/tmpuploads/<myfile> of=/raidmount/uploads/<myfile> oflag=direct bs=8196k