TCP tuning trick cho HTTP server
System
17
White

huydx viết ngày 30/06/2016

Thấy bài viết hay quá nên lôi về đây cho mọi người cùng tham khảo: https://tools.ietf.org/html/draft-stenberg-httpbis-tcp-01

Một use case rất hay được biết đến trong những người làm web là server sử dụng http để kết nối với user (ví dụ như nginx server hay apache server), chạy trên unix. Tuy nhiên những setting default của unix server thường không tuning tốt nhất cho http protocol. Bài viết dưới sẽ cung cấp một số setting cho http server sao cho có thể đạt được performace / throughput cao nhất.

Bài viết được dịch từ bản draft của nhóm IETF ( Internet Engineering Task Force ), hay chính là nhóm tạo ra các qui chuẩn của internet.

Bài viết sẽ có những setting chia theo nhiều mức độ khác nhau bao gồm "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", và "OPTIONAL".

Socket planning

Dưới đây sẽ không đưa ra con số cụ thể cho các setting mà chỉ đưa ra các option có thể có. Con số cụ thể phụ thuộc vào độ lớn của hệ thông, các bạn scaling (horizontal hay vertical). Con số cụ thể sẽ cần test dựa trên benchmark một cách cẩn thận

1. Số lượng open file

Một http server hiện đại sẽ cần đáp ứng một lượng rất lớn TCP connection (mà như bạn đã biết, socket connection chính là file trên unix). Do đó bạn cần chắc chắn là số lượng open files lớn nhất của hệ thống là phù hợp. Con số đó có thể được tuỳ chỉnh dựa vào

 fs.file-max = <number of files>

2. Số lượng của concurrent network-message

Tăng số lượng packet mà được cho phép queue vào một interface, đặc biệt khi mà số lượng packet nhận được lớn hơn số lượng packet mà kernel có thể xử lý. Tăng con số này sẽ có ích khi mà xử lý của kernel là không ổn định lúc nhanh lúc chậm

net.core.netdev_max_backlog = <number of packets>

3. Số lượng TCP SYN được cho phép cho vào backlog

Đây chính là số lượng TCP connection mới cho phép queue để kernel xử lý. Con số này có thể được tăng bằng

net.core.somaxconn = <number>

4. Sử dụng toàn bộ port có thể cho localhost

Để chắc chắn TCP có thể tận dụng tối đa số lượng socket chúng ta nên mở toàn bộ port để sử dụng trên local

net.ipv4.ip_local_port_range = 1024 65535

5. Giảm bớt thời gian timeout của TCP FIN

Thông thường http connection sẽ kết thúc ngay sau khi client nhận được response, do đó mà server sẽ phải chịu rất nhiều connection "chóng tàn". Do đó mà đã tàn thì tàn sớm sớm để cho bạn khác còn vào xử lý chính là ý nghĩa của config này

  net.ipv4.tcp_fin_timeout = <number of seconds>

6. Sử dụng lại socket ở trạng thái TIME_WAIT

Khi chạy backend server ở một network mà có low latency, bạn sẽ muốn reuse lại socket ở trạng thài TIME_WAIT. Thông thường các socket ở trạng thái này là các socket đã bị chết đột tử.

   net.ipv4.tcp_tw_reuse = 1

7. TCP socket buffer sizes và Window scaling

Hệ thống http backend server sẽ cần xử lý một lượng connection rất lớn. Do đó mà memory cần cho TCP socket buffers cũng phải là rất lớn. Ở một số hệ thống sẽ cho tuỳ chỉnh số buffer của TCP socket , cũng như min và max của buffer này.

net.ipv4.tcp_wmem = <minimum size> <default size> <max size in bytes>
net.ipv4.tcp_rmem = <minimum size> <default size> <max size in bytes>

Khi quyết max size ở config trên, bạn cũng cần để ý đến BDP (Bandwidth Delay Product) của môi trường bên phía client. Một con số quá lớn so với mức cần thiết của buffer size cũng có thể gây ra tăng khả năng retransmission của TCP packet (Tham khảo thêm RFC7141)

8. Maximum allowed TCP window sizes

Bạn sẽ muốn tăng window size cho phép lớn nhất. Tuy nhiên giá trị này bắt buộc phải nằm trong giá trị cho phép.

   net.core.rmem_max = <number of bytes>
   net.core.wmem_max = <number of bytes>

9. Timers và Timeout

Thông thường ở các hệ thống hiện đại thì một server sẽ phải đáp ứng cho cả các connection nhanh và chậm. Tuy nhiên tuỳ thuộc vào web server của bạn sẽ phải phục vụ cho web push, long polling hay chỉ đơn thuần là phục vụ file tĩnh thì sẽ có các cách setting khác nhau.

Fail 'fast' : TCP resource là có hạn và các socket sẽ phải tranh giành nhau. Server sẽ phải quyết định trong một time frame nhất định là một connection là sống hay chết. Ví dụ như một web server phục vụ file tĩnh mà để timeout lên đến 30s sẽ là không hợp lý, khi mà user có thể ngắt connection vào giây thứ 10. Ở một server mà phài mix giữa nhiều "quality of service" thì chúng ta nên quyết một "quality of service" chung mà không một service nào bị quá bất hợp lý.

Có khá nhiều option cho time out bao gồm Connection (client), time to request(server), time to first byte(client), between bytes(server/client), total connection time(server/client). Một số hệ thống "merge" tất cả các timeout này thành một giá trị duy nhất.

TCP handshake

1. TCP Fast Open

TCP Fast Open cho phép chúng ta gửi dữ liệu ngay từ khi còn đang handshake (Tham khảo thêm RFC7413). TFO yêu cầu support từ cả phía client và server, và còn cần thêm cả support từ phía application. Chính vì thế mà TFO chỉ có thể sử dụng trong các method HTTP "safe" như là GET và HEAD, hay là method negotiation như là TLS.

2. Initial Congestion Window

RFC6928 qui định initcwnd (initial congestion window) với giá trị ban đầu là 10. Có một số thực nghiệm thay đổi giá trị này, kết hợp với packet pacing. Tuy nhiên IW10 vẫn được report là đạt được kết quả tốt trong server với tải rất lớn.

3. TCP SYN flood handling

RFC4987 qui định giá trị để tweak cho phòng trống TCP SYN flood.

TCP transfers

1. Packet pacing

TBD

2. Explicit Congestion Control

TBD

3. Nagle's Algorithm

Nagle Algorithm (https://tools.ietf.org/html/rfc896), là cơ chế để khiến TCP stack giữ một lượng nhỏ packet trong một khoảng thời gian ngắn, với mục đích để "merge" với các packet sắp được chuyển đi tiếp. Việc này sẽ giúp optmize cả throughput lẫn latency.

Tuy nhiên thuật toán này yêu cầu client phải gửi lại packet đủ nhanh, và nếu không đáp ứng được thì có thể gây ảnh hưởng đến hệ thống.

Với POSIX socket thì bạn có thể switch off bằng

   int one = 1;
   setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));

4. Keep alive

TCP keep alive thường default là off, đặc biệt với mobile client, với lý do là để tiết kiệm pin. App-level keep alive cũng là bắt buộc để detect connection reset chẳng hạn.

Reusing connections

Slow Start sau trạng thái Idle

Slow Start là thuật toán dùng để kiểm soát ùn tắc trong network, hay còn được biết đến là exponential growth. Mỗi TCP connection sẽ bắt đầu với slow start, sau đó sẽ quay lại trạng thái slow start sau một khoảng thời gian idle nhất định. Với linux thì bạn có thể tắt hành vi này bằng

   net.ipv4.tcp_slow_start_after_idle = 0
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

115 bài viết.
857 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
135 8
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết hơn 1 năm trước
135 8
White
109 14
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết gần 3 năm trước
109 14
White
86 10
(Ảnh) Mở đầu Chắc nhiều bạn đã nghe đến khái niệm oauth. Về cơ bản thì oauth là một phương thức chứng thực, mà nhờ đó một web service hay một ap...
huydx viết hơn 2 năm trước
86 10
Bài viết liên quan
White
7 3
Đã có rất nhiều bài viết về process trên linux trên kipalog https://kipalog.com/posts/HedieuhanhProcess https://kipalog.com/posts/GioithieuveUN...
LinhPT viết 12 tháng trước
7 3
White
6 4
Ý nghĩa vm.swappiness là một biến trong Linux kernel điều khiển khi nào Linux kernel nên swap một page ra khỏi bộ nhớ đang sử dụng. Giá trị này c...
Bùi Hồng Hà viết gần 3 năm trước
6 4
White
4 0
Giới thiệu Các bạn là fan của tính toán phân tán]] chắc hẳn đều biết Werner Vogels]] (CTO của amazon) cũng như trang blog All Things Distributed]]...
Bùi Hồng Hà viết gần 3 năm trước
4 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
115 bài viết.
857 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!