Cài đặt TCP có độ trễ thấp trên Ubuntu


10

Có một máy chủ cho các phép đo chạy trên Ubuntu trong phòng thí nghiệm của tôi. Và có chương trình C, nhận dữ liệu thông qua kết nối TCP và càng sớm càng tốt để gửi trả lời.

Cấu hình

  • CPU: 2 bộ xử lý x 4 lõi - Intel (R) Xeon (R) CPU E5345 @ 2.33GHz
  • RAM: 12 GB
  • NIC: Bộ điều khiển Intel Gigabit 80003ES2lan Gigabit Ethernet / Bộ điều khiển Gigabit Ethernet 82546EB
  • Chuyển đổi mạng: Cisco Catalyst 2960
  • Thông tin dữ liệu: Khối dữ liệu đến khoảng. mỗi 10 mili giây. Kích thước khối dữ liệu là khoảng. 1000 byte.

Độ trễ mạng khi nhận gói là rất quan trọng (hàng chục micro giây là quan trọng). Tôi đã tối ưu hóa chương trình đến mức tối đa, nhưng tôi không có kinh nghiệm điều chỉnh Ubuntu.

Điều gì có thể được cấu hình trong Ubuntu để giảm độ trễ xử lý / gửi gói cục bộ?


Có, tôi muốn biết mô hình / mô hình của máy chủ.
ewwhite

bạn nên đào sâu hơn. đọc một số thứ về tối ưu hóa kernel cho giao dịch tần số cao. Fe a sales Cisco Paper: cisco.com/c/dam/en/us/products/collonymous/switches/ mẹo vì vậy hãy lấy Thẻ PCI-E đàng hoàng ở cả hai bên sẽ tiết kiệm được một phần. Rất có thể (tùy thuộc vào thời gian bạn muốn dành cho việc này), bạn sẽ xây dựng lại ít nhất là kernel với các cài đặt khác nhau, loại bỏ rất nhiều thứ mà Ubuntu cần nhưng bạn không làm. Vì vậy, như ewwhite đã viết trong các bình luận, ubfox có thể không hoàn hảo cho các cài đặt thấp nhất.
Dennis Nolte

Với phần cứng được liệt kê, đó là thiết bị có từ thời 2008 (CPU Intel 5300-series). Trước đó, không có quá nhiều thay đổi phần cứng có độ trễ thấp đặc biệt có thể xảy ra. Tôi đã thiết lập BIOS hệ thống để chạy ở chế độ hiệu năng cao và vô hiệu hóa CPU C-States.
ewwhite

@ewwhite Vâng, bạn nói đúng về thiết bị thời đại 2008. Tôi se thử lơi gợi y của bạn. Cảm ơn bạn!
Alex V

Bất kỳ khả năng điều chỉnh phần mềm này cho TCP_NODELAY?
Matt

Câu trả lời:


10

Thành thật mà nói, tôi sẽ không sử dụng Ubuntu cho việc này ... nhưng có những tùy chọn có thể được áp dụng cho bất kỳ biến thể Linux nào.

Bạn sẽ muốn tạo ra bộ đệm ngăn xếp mạng của bạn:

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

Nếu ứng dụng ghi vào đĩa, có thể cần phải thay đổi lịch trình / thang máy (ví dụ: deadlinethang máy).

Ở cấp độ máy chủ, bạn có thể sửa đổi bộ điều chỉnh CPU và quản lý tần số nguồn và CPU (P-States, C-States).

Ở cấp độ HĐH, bạn có thể thay đổi mức ưu tiên thời gian thực của ứng dụng ( chrt), tối ưu hóa để giảm gián đoạn, ghim nó vào CPU hoặc nhóm CPU ( taskset) và dừng bất kỳ dịch vụ hoặc trình nền không cần thiết nào.

Bạn cũng có thể xem một số đề xuất tại: Cách khắc phục độ trễ giữa 2 máy chủ linux

Thật khó để có được cụ thể hơn mà không biết phần cứng hoặc thiết bị mạng liên quan.


3
Đây thực sự không phải là địa điểm thích hợp cho các cuộc tranh luận tôn giáo. Mang nó đi nơi khác, chẳng hạn như trò chuyện.
Michael Hampton

1
@MichaelHampton Có các liên kết thú vị trong cuộc thảo luận liên quan đến câu hỏi: Hướng dẫn điều chỉnh thời gian thực của Red Hat .
Alex V

6

Nếu bạn đang đi theo con đường hiệu suất cao thông thường, bạn sẽ muốn chạy càng ít quy trình (theo lịch trình) khác càng tốt vì chúng sẽ can thiệp vào ứng dụng của bạn.

Linux, giống như các hệ điều hành UNIX cổ điển, được thiết kế để chạy đồng thời nhiều ứng dụng một cách công bằng và cố gắng ngăn chặn tình trạng đói tài nguyên và bạn sẽ nhắm đến điều ngược lại, bỏ đói mọi thứ khác trừ ứng dụng của bạn. Các bước đơn giản ở cấp độ HĐH đang thay đổi mức độ đẹp và mức độ ưu tiên theo thời gian thực của ứng dụng của bạn, thay đổi lịch trình hoặc lấy kernel thời gian thực .

TCP / IP thường được điều chỉnh để ngăn chặn sự sụt giảm kết nối và sử dụng hiệu quả băng thông có sẵn. Để có được độ trễ thấp nhất có thể từ một liên kết rất nhanh, thay vì lấy băng thông cao nhất có thể ra khỏi kết nối mà một số liên kết trung gian bị hạn chế hơn, bạn sẽ điều chỉnh điều chỉnh ngăn xếp mạng.

 sysctl -a 

sẽ hiển thị cho bạn một loạt các cài đặt hạt nhân mà bạn có thể điều chỉnh. Cài đặt tùy thuộc vào việc bạn có sử dụng IPv4 hoặc IPv6 hay không và chính xác những gì bạn đã làm trong ứng dụng của mình nhưng điều đáng quan tâm có thể là:

  • net.ipv4.tcp_window_scaling=1 RFC 1323 - hỗ trợ cho kích thước cửa sổ TCP IPV4 lớn hơn 64K - thường cần thiết trên các mạng băng thông cao
  • net.ipv4.tcp_reordering=3 Số lần tối đa một gói IPV4 có thể được sắp xếp lại trong luồng gói TCP mà không cần TCP giả định mất gói và bắt đầu chậm.
  • net.ipv4.tcp_low_latency=1dự định ưu tiên cho độ trễ thấp hơn thông lượng cao hơn; cài đặt = 1 vô hiệu hóa quá trình xử lý trước IPV4 tcp
  • net.ipv4.tcp_sack=0 cài đặt thành 1 cho phép xác nhận có chọn lọc đối với IPV4, yêu cầu bật tcp_timestamp và thêm một số chi phí gói mà bạn không cần nếu bạn không gặp phải packloss
  • net.ipv4.tcp_timestamps=0 Chỉ khuyên trong trường hợp cần sa thải.
  • net.ipv4.tcp_fastopen=1 Cho phép gửi dữ liệu trong gói SYN mở.

Hầu hết nếu không phải tất cả đều được ghi nhận tốt hơn trong nguồn kernel .

Tất nhiên, bạn có thể mã hóa các socket TCP thô và phần lớn bằng cách vượt qua ngăn xếp TCP / IP kernel hoàn toàn.

Thông thường các hệ thống được điều chỉnh cao chạy trong một mạng đáng tin cậy và sẽ tắt tường lửa cục bộ (iptables).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.