2012-06-28 26 views
6

Tôi sẽ xây dựng máy chủ tệp lớn và cần tư vấn cộng đồng ngăn xếp ngăn xếp cho lựa chọn hệ thống tệp (linux).Hệ thống tệp tốt nhất để phân phối tệp 1GB bằng nginx, dưới mức viết vừa phải, đọc hiệu suất khôn ngoan?

Máy chủ tệp sẽ phân phát các tệp tĩnh có kích thước 1-2 GB (hầu hết là khác nhau với mọi yêu cầu) qua Nginx, dưới mức trung bình liên tục ghi vào đĩa (RAID5 SATA/7200 đĩa lớn). Tỷ lệ ghi để đọc là khoảng 1: 5-10, cho mỗi 1 byte được viết mỗi giây, 5-10 được đọc. Quan trọng nhất đối với tôi là đọc hiệu suất, tôi có thể sống với ghi chậm hơn.

Hệ thống tệp Linux nào sẽ là giải pháp tốt nhất cho tác vụ này? Và tại sao :) Cảm ơn!

Trả lời

0

Các tệp rất lớn có xu hướng không phụ thuộc vào hệ thống tệp bạn sử dụng, hệ thống tệp hiện đại (nghĩa là không phải FAT!) Thực hiện tốt công việc phân bổ chúng trong các vùng lưu trữ tiếp giáp lớn và do đó giảm thiểu độ trễ tìm kiếm. Nơi bạn có xu hướng thấy sự khác biệt giữa chúng có hiệu suất nhỏ, khả năng phân mảnh trong các tình huống ngoài không gian, đồng thời, vv… Lưu trữ các tệp lớn là một vấn đề tương đối dễ, và tôi nghi ngờ bạn sẽ thấy sự khác biệt có thể đo lường được.

Nhưng như mọi khi: nếu bạn thực sự quan tâm, điểm chuẩn. Không có câu trả lời đơn giản về hiệu năng hệ thống tập tin.

+0

Vì vậy, không đúng :(Đã bao giờ bạn cố gắng xóa các tập tin lớn trên ext2-3 vs xfs vs JFS? Ngoài ra, một cái nhìn tại các kernel mã nguồn sẽ đã tiết lộ cho bạn, mà fs khác nhau trình điều khiển dành thời gian khác nhau trong các phần quan trọng, họ cũng có xu hướng cư xử _radically_ khác nhau dưới áp lực IO cao. –

+0

Xóa tệp lớn không phải là trường hợp sử dụng. Nếu bạn có số, hãy hiển thị chúng. Tôi đứng trước những gì tôi viết. –

+0

số? "có những lời nói dối, dối trá và sau đó là điểm chuẩn" Tôi chưa thấy điểm chuẩn mà không có bất kỳ mục tiêu tiếp thị nào. Tôi đã nói về kinh nghiệm của mình và nguồn nhân Linux có sẵn công khai. Điểm mà tôi nghi ngờ bạn sẽ thấy sự khác biệt có thể đo lường được là vô lý tuy nhiên. –

4

Để cung cấp kết quả tốt nhất với nội dung tải nặng, có điều gì đó khác cần điều chỉnh. Hãy xem tại Nginx core developer's comment dưới đây:

  1. Tắt sendfile, nó hoạt động xấu đến khối lượng công việc đó theo linux do không có khả năng kiểm soát readahead (và do đó khối đọc từ đĩa).

    gửi đi;

  2. Sử dụng lớn đầu ra bộ đệm

    output_buffers 1 512k

  3. Hãy thử sử dụng aio để đảm bảo đĩa đồng thời tốt hơn (và lưu ý dưới linux nó cần directio cũng), tức là một cái gì đó như thế này

    aio bật; directio 512;

khuyến nghị khác:

  1. Kiểm tra hoán đổi hệ thống tập tin không được sử dụng

  2. Filesystem - ext4, xfs. Tốt để bật tùy chọn gắn kết data_writeback và noatime

5

Tôi đạt được hiệu suất "đọc ngẫu nhiên" 80MB cho mỗi đĩa "thực" (trục chính). Đây là những phát hiện của tôi.

Vì vậy, trước tiên, hãy quyết định số lượng lưu lượng truy cập bạn cần để đẩy xuống người dùng và dung lượng bạn cần cho mỗi máy chủ.

Bạn có thể bỏ qua lời khuyên thiết lập đĩa được đưa ra bên dưới vì bạn đã có thiết lập RAID5.

Cho phép lấy ví dụ về máy chủ băng thông 1Gbps chuyên dụng có 3 * 2TB đĩa. Giữ đĩa đầu tiên dành riêng cho OS và tmp. Đối với 2 đĩa khác, bạn có thể tạo ra một cuộc tấn công phần mềm (Đối với tôi, nó hoạt động tốt hơn so với cuộc tấn công phần cứng trên bo mạch). Khác, bạn cần phải chia các tập tin của bạn như nhau trên đĩa độc lập. Ý tưởng là để giữ cho cả hai chia sẻ đĩa đọc/ghi tải bằng nhau. Phần mềm raid-0 là lựa chọn tốt nhất.

Nginx Conf Có hai cách để đạt được mức độ cao về hiệu suất sử dụng nginx.

  1. sử dụng directio

    aio trên;
    directio 512; output_buffers 1 8m;

    "Tùy chọn này sẽ yêu cầu bạn có số lượng ram" Khoảng 12-16GB ram là cần thiết.

  2. userland io

    output_buffers 1 2m;

    "chắc chắn rằng bạn đã thiết readahead để 4-6MB cho cuộc tấn công phần mềm gắn kết" blockdev --setra 4096/dev/md0 (hoặc mount đĩa độc lập)

    Thiết lập này một cách tối ưu sẽ sử dụng bộ nhớ cache tập tin hệ thống, và yêu cầu ram ít hơn nhiều. Cần khoảng 8GB ram.

Ghi chú chung:

  • giữ "sendfile tắt;"

bạn cũng có thể muốn sử dụng ga băng thông để cho phép 100 kết nối qua băng thông có sẵn. Mỗi kết nối tải xuống sẽ sử dụng 4MB ram hoạt động.

 limit_rate_after 2m; 
     limit_rate 100k; 

Cả hai giải pháp trên sẽ mở rộng quy mô một cách dễ dàng để 1k + người sử dụng đồng thời trên một máy chủ 3 đĩa. Giả sử bạn có băng thông 1Gbps và mỗi kết nối được điều chỉnh ở 1Mb/ps Có thêm thiết lập cần thiết để tối ưu hóa ghi đĩa mà không ảnh hưởng đến việc đọc nhiều.

làm cho tất cả các tệp tải lên lên đĩa os chính trên giá trị gắn kết/tmpupload. điều này sẽ đảm bảo không có xáo trộn liên tục trong khi đọc nặng đang diễn ra. Sau đó di chuyển tệp từ/tmpupload bằng lệnh "dd" bằng oflag = direct. cái gì đó như

dd if=/tmpuploads/<myfile> of=/raidmount/uploads/<myfile> oflag=direct bs=8196k 
Các vấn đề liên quan