Làm thế nào tôi có thể theo dõi chiều dài của hàng đợi chấp nhận?


9

Tôi có một giả thuyết: đôi khi các kết nối TCP đến nhanh hơn máy chủ của tôi accept(). Họ xếp hàng cho đến khi hàng đợi tràn ra và sau đó có vấn đề.

Làm thế nào tôi có thể xác nhận điều này đang xảy ra?

Tôi có thể theo dõi độ dài của hàng đợi chấp nhận hoặc số lần tràn không? Có một quầy tiếp xúc ở đâu đó?


Bạn đang tìm kiếm netstat.
Satō Katsura

Theo như tôi có thể nói, netstatchỉ hiển thị độ dài hàng gửi và nhận, không giống với hàng đợi chấp nhận.
Phil Frost

Vâng, nó không được hiển thị theo mặc định. man netstat | less +/Flags
Satō Katsura

Tôi không chắc những lá cờ đó cho tôi biết chiều dài hàng đợi chấp nhận - thực tế netstatdường như hoàn toàn không hiển thị Flagscho các kết nối TCP. Từ một thử nghiệm nhỏ, có vẻ như các kết nối được hiển thị như ESTABLISHEDtrong netstat, ngay cả khi tôi thử mở các kết nối đến một quy trình thực hiện listen()nhưng không bao giờ accept().
Phil Frost

Phải, nhìn vào các nguồn có vẻ như các cờ đó là dành cho các socket UNIX. Đối với TCP, bạn chỉ có thể đếm SYN_RECV. Không có hàng đợi nào khác ngoài điều đó. Tôi cho rằng hạt nhân có thể được bảo bằng cách nào đó để ghi lại các gói bị rơi do có quá nhiều kết nối nửa mở, nhưng đã hơn 10 năm kể từ khi tôi xem xét kết nối với Linux, vì vậy tôi không biết làm thế nào để làm điều đó. Một lưu ý phụ: bạn không chờ đợi accept()để thực hiện công việc của mình, bạn đang chờ ACKs đến từ các máy chủ kết nối để hoàn tất các kết nối.
Satō Katsura

Câu trả lời:


3

Để kiểm tra xem hàng đợi của bạn có bị tràn hay không, hãy sử dụng netstat hoặc nstat

[centos ~]$ nstat -az | grep -i listen
TcpExtListenOverflows           3518352            0.0
TcpExtListenDrops               3518388            0.0
TcpExtTCPFastOpenListenOverflow 0  0.0

[centos ~]$ netstat -s | grep -i LISTEN
    3518352 times the listen queue of a socket overflowed
    3518388 SYNs to LISTEN sockets dropped

Tham khảo: https : // perf sync.com/2015/12/26/investigating-linux-network-issues-with-netstat-and-nstat/

Để theo dõi kích thước hàng đợi của bạn, hãy sử dụng lệnh ss và tìm các ổ cắm SYN-RECV.

$ ss -n state syn-recv sport = :80 | wc -l
119

Tham khảo: https://blog.cloudflare.com/syn-packet-handling-in-the-wild/


2

Sysdig sẽ cung cấp một số thông tin này ở cuối mỗi tòa nhà accept, làm queuelenđối số. Nó cũng hiển thị chiều dài của hàng đợi như queuemax.

7598971 21:05:30.322229280 1 gunicorn (6451) < accept fd=13(<4t>127.0.0.1:45882->127.0.0.1:8003) tuple=127.0.0.1:45882->127.0.0.1:8003 queuepct=0 queuelen=0 queuemax=10

Theo như tôi biết, nó không cung cấp cơ chế nào để biết chính xác khi nào hoặc bao nhiêu lần hàng đợi đã tràn. Và sẽ rất khó để tích hợp điều này với giám sát định kỳ bằng collectdhoặc tương tự.


0

Những gì bạn đang tìm kiếm là mục nhập trong đầu ra của lệnh sysctl -a như vậy :::

net.ipv4.tcp_max_sync_backlog = 4096

Trong trường hợp ví dụ trên, tồn đọng của các kết nối trạng thái SYN là tối đa 4096. Bạn có thể tăng mức đó dựa trên lượng RAM trong máy chủ của bạn. Tôi coi tồn đọng 32K là một khởi đầu tốt để điều chỉnh các máy chủ web được tải nặng.

Ngoài ra, hãy đảm bảo các mục sau KHÔNG được đặt thành Một (1) ::

net.ipv4.tcp_abort_on_overflow = 0

Nếu không, nó chắc chắn sẽ bỏ các gói nếu có tràn tồn đọng.

Bạn có thể dễ dàng kiểm tra thông qua

"sysctl -a | egrep tồn đọng"

"sysctl -a | egrep tràn"

Ngoài ra, bạn có thể tìm thấy nhãn "bị rớt" bên dưới

"ifconfig -a"

đầu ra của lệnh. Điều đó cho thấy có bao nhiêu gói đã bị hủy cho mỗi giao diện cùng với các dữ liệu và lỗi khác, v.v.

Để ghi nhật ký các gói bị rơi, có một bài viết về paywall trên RHEL 7 ::

https://access.redhat.com/solutions/1191593

Để nghiên cứu thêm, bạn có thể đọc:

http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html

Nó nêu ở đây theo Sách / Minh họa TCP / IP của Steven:

"Giới hạn hàng đợi áp dụng cho tổng [[]] số lượng mục nhập trên hàng đợi kết nối không hoàn chỉnh [Vách] và [Rắc] số lượng mục trên hàng đợi kết nối đã hoàn thành [Rắc]."

Do đó cũng nói rằng:

"Hàng đợi kết nối đã hoàn thành hầu như luôn trống vì khi một mục nhập được đặt trên hàng đợi này, lệnh gọi của máy chủ chấp nhận trả về và máy chủ sẽ ngắt kết nối hoàn thành khỏi hàng đợi."

Do đó, hàng đợi chấp nhận có vẻ hoàn toàn trống rỗng và bạn sẽ phải điều chỉnh máy chủ Web Apache (có thể trong trường hợp này) để chấp nhận nhanh hơn các kết nối được đặt trên hàng đợi "tổng hợp".


Mặc dù dường như có một số thông tin hữu ích ở đây, tôi không chắc nó trả lời câu hỏi. Nếu tôi hỏi, thì đây là số lượng người nhiều nhất từng có mặt trong khán phòng này? Một lần, và bạn chỉ vào một dấu hiệu trên tường mang lại sức chứa tối đa, bạn đã không trả lời câu hỏi.
Scott

Thật vậy, tôi đang tìm kiếm chiều dài hiện tại của hàng đợi, không phải chiều dài tối đa của hàng đợi.
Phil Frost

3
Nó phải là tcp_max_syn_backlog, không phải tcp_max_SYNC_backlog như trong câu trả lời của bạn
DevilaN

Vâng ... và StackOverflow cung cấp cho bạn một thông báo lỗi chậm khi bạn cố gắng thay đổi nó: "Chỉnh sửa phải có ít nhất 6 ký tự; có gì khác để cải thiện trong bài đăng này không?"
Aaron C. de Bruyn
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.