Tôi muốn tìm hiểu cấu hình / phần cứng tốt nhất có thể để cung cấp 40Gbps từ một máy chủ duy nhất trong câu hỏi này.
Tình hình
Chúng tôi có một máy chủ proxy chia sẻ video giúp giảm tải các đỉnh từ các máy chủ lưu trữ chậm phía sau nó. Tất cả lưu lượng chỉ là HTTP. Máy chủ hoạt động như một proxy ngược (các tệp không được lưu trong bộ nhớ cache trên máy chủ) và máy chủ web (các tệp được lưu trữ trên các ổ đĩa cục bộ).
Hiện tại có khoảng 100TB tệp và đang phát triển trên các máy chủ lưu trữ phụ trợ.
Cơ chế lưu trữ được triển khai độc lập và câu hỏi này không phải là về bộ nhớ đệm vì nó hoạt động rất tốt - hiện cung cấp 14Gbps, truyền đến các máy chủ phụ trợ chỉ 2Gbps. Vì vậy, việc sử dụng bộ nhớ cache là tốt.
Mục tiêu
Đạt được 40Gbps hoặc thậm chí nhiều hơn thông lượng từ một máy duy nhất.
Phần cứng 1
CTNH: Supermicro SC825, X11SSL-F, Xeon E3-1230v5 (4C/8T@3.4GHz), RAM DDR4 16GB, 2x Supermicro 10G STGN-i1S (LACP L3 + 4)
SSD: 1x 512GB Samsung, 2x 500GB Samsung, 2x480GB Intel 535, 1x 240GB Intel S3500
Hệ thống:
- irqbalancer dừng lại
- set_irq_affinity cho mỗi giao diện (thông qua tập lệnh trong tarball trình điều khiển ixgbe)
- ixgbe-4.3.15
- Hạn chót của lịch trình I / O
- iptables trống (mô-đun không tải)
- Hệ thống tập tin: XFS
Nginx:
- gửi đi
- chủ đề aio
- chỉ đạo 1 triệu
- tcp_nopush trên
- tcp_nodelay trên
Như đã thấy trên các biểu đồ, chúng tôi có thể đẩy 12,5Gbps. Thật không may, máy chủ đã không phản hồi.
Có 2 điều khiến tôi chú ý. Đầu tiên là số lượng IRQ cao. Trong trường hợp này, tôi không may có đồ thị từ / Proc / ngắt. Điều thứ hai là tải hệ thống cao, mà tôi nghĩ là do kswapd0 gặp vấn đề khi chỉ hoạt động với 16G RAM.
Phần cứng 2
CTNH: Supermicro SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1,70GHz), RAM DDR4 128GB, 2x Supermicro 10G STGN-i1S
SSD, Cấu hình hệ thống giống như phần cứng 1. Nginx được sendfile trên (aio / sendfile so với hơn nữa).
Điều này có vẻ tốt hơn, vì vậy bây giờ khi chúng ta có một máy chủ, hoạt động trong các đỉnh, chúng ta có thể thử một số tối ưu hóa.
Sendfile vs aio chủ đề
Tôi đã cố gắng vô hiệu hóa sendfile và sử dụng chủ đề aio thay thế.
- gửi đi
- chủ đề aio
- directio 1M (phù hợp với tất cả các tệp chúng tôi có)
đấu với
- gửi đi
Sau đó, lúc 15:00 tôi chuyển trở lại sendfile và tải lại nginx (vì vậy phải mất một lúc để hoàn thành các kết nối hiện có). Thật là tốt khi việc sử dụng ổ đĩa (được đo bằng iuler) đã giảm xuống. Không có gì thay đổi về lưu lượng truy cập (tiếc là zabbix đã quyết định không thu thập dữ liệu từ bond0).
gửi / tắt
Chỉ cần cố gắng để bật / tắt gửi. Không có gì thay đổi ngoại trừ ngắt lịch.
irqbalancer là máy chủ / cron / bị vô hiệu hóa
Như @lsd đã đề cập, tôi đã cố gắng thiết lập irqbalancer để được thực thi thông qua cron:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
Thật không may, nó đã không giúp đỡ trong trường hợp của tôi. Một trong những card mạng bắt đầu hành xử kỳ lạ:
Tôi không thể tìm thấy những gì sai trong biểu đồ và khi nó xảy ra vào ngày hôm sau, tôi đăng nhập vào máy chủ và thấy rằng một lõi ở mức 100% (sử dụng hệ thống).
Tôi đã cố gắng để bắt đầu mất cân bằng như một dịch vụ, kết quả vẫn như vậy.
Sau đó, tôi quyết định sử dụng tập lệnh set_irq_affinity và nó đã khắc phục sự cố ngay lập tức và máy chủ đã đẩy 17Gbps một lần nữa.
Phần cứng 3
Chúng tôi đã nâng cấp lên phần cứng mới: 2U 24 (+2) ổ đĩa khung gầm (6xSFF), 2x Xeon E5-2620v4, RAM DDR4 64GB (mô-đun 4x16GB), SSD 13x, 2x Supermicro (với chip Intel). CPU mới cải thiện hiệu suất rất nhiều.
Thiết lập hiện tại vẫn còn - sendfile, v.v. Chỉ khác là chúng ta chỉ để một CPU duy nhất xử lý cả hai card mạng (thông qua tập lệnh set_irq_affinity).
Đã đạt đến giới hạn 20Gbps.
Mục tiêu tiếp theo? 30Gb / giây.
Hãy bắn vào tôi ý tưởng làm thế nào để cải thiện hiệu suất. Tôi sẽ rất vui khi thử nó trực tiếp và chia sẻ một số biểu đồ nặng ở đây.
Bất kỳ ý tưởng làm thế nào để đối phó với số lượng lớn SoftIRQ trên cpu?
Đây không phải là một câu hỏi về lập kế hoạch năng lực - Tôi đã có phần cứng và lưu lượng. Tôi luôn có thể phân chia lưu lượng truy cập cho một số máy chủ (điều mà tôi sẽ phải làm trong tương lai) và khắc phục vấn đề bằng tiền. Tuy nhiên, đây là một câu hỏi về tối ưu hóa hệ thống và điều chỉnh hiệu suất trong một kịch bản trực tiếp thực sự.