Cấu trúc ổ cắm hạt nhân và TCP_DIAG


18

Tôi đang làm việc trên một phần mềm kết nối với máy chủ dữ liệu Thời gian thực (sử dụng TCP) và tôi có một số kết nối bị mất. Tôi đoán là khách hàng không đọc dữ liệu đến từ máy chủ đủ nhanh. Vì vậy, tôi muốn theo dõi các ổ cắm TCP của tôi. Đối với điều này, tôi tìm thấy công cụ "ss".

Công cụ này cho phép xem trạng thái của mọi ổ cắm - đây là một dòng ví dụ về đầu ra của lệnh ss -inm 'src *:50000'

ESTAB      0      0             184.7.60.2:50000       184.92.35.104:1105
  mem:(r0,w0,f0,t0) sack rto:204 rtt:1.875/0.75 ato:40

Câu hỏi của tôi là: phần bộ nhớ có nghĩa là gì? Nhìn vào mã nguồn của công cụ tôi thấy rằng dữ liệu đến từ cấu trúc kernel ( sockin sock.h). Chính xác hơn, nó đến từ các lĩnh vực:

r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;

Có ai biết ý nghĩa của chúng? Tôi đoán là:

  • rmem_alloc : kích thước của bộ đệm trong
  • wmem_alloc : kích thước của bộ đệm ngoài
  • sk_forward_alloc : ???
  • sk->sk_wmem_queued : ???

Dưới đây là kích thước bộ đệm của tôi:

net.ipv4.tcp_rmem = 4096        87380   174760
net.ipv4.tcp_wmem = 4096        16384   131072
net.ipv4.tcp_mem = 786432       1048576 1572864
net.core.rmem_default = 110592
net.core.wmem_default = 110592
net.core.rmem_max = 1048576
net.core.wmem_max = 131071

Cấu hình kích thước bộ đệm của bạn là gì? Bạn có thấy bộ đệm nhận được bão hòa trên các kết nối ổ cắm không? Có phải nhóm của bạn bỏ kết nối trên EWOULDBLOCK?
Karlson

Kích thước ổ cắm của tôi khá nhỏ tôi nghĩ rằng, tôi đã cập nhật bài viết với chúng. Đối với EWOULDBLOCK tôi không thể nói. Máy khách của tôi đang ở trong JAVA và chỉ nói rằng nó đã bị ngắt kết nối bởi máy chủ. Máy chủ đang ở trong C ++ và nó chỉ nói rằng anh ta đã ngắt kết nối mà không có bất kỳ thông tin nào. Tôi không có mã nguồn của máy chủ nên tôi không thể thay đổi hành vi của nó. Có vẻ như các máy khách bị ngắt kết nối khi chúng hơi quá tải, ngay cả khi nó chỉ kéo dài trong vài giây.
Twister

Là cấu hình của kích thước bộ đệm có thể điều chỉnh trên máy chủ? Bạn có thể xem kích thước bộ đệm trên máy khách? Bạn có quyền truy cập vào nguồn của khách hàng? Bạn đã chạy netstat -apnc để xem kích thước bộ đệm chưa? Bạn đã thử tăng kích thước bộ đệm trong kernel để xem điều gì xảy ra chưa?
Karlson

Đúng vậy, và đã được đặt thành giá trị tối đa của máy chủ (tôi tin rằng chúng không thể lớn hơn các thuộc tính net.ipv4.tcp_ *, phải không?) Đối với netstat -apnc, nó không cung cấp cho tôi kích thước bộ đệm, đó là lý do tại sao tôi nhìn vào ss. Đối với kernel tôi không root trên máy chủ và các đội CNTT ở đây khá cứng đầu. Tôi cần chắc chắn về những gì xảy ra trước khi tôi yêu cầu họ thay đổi các giá trị ... Và vâng tôi có quyền truy cập vào nguồn máy khách và cuộc điều tra của tôi về máy khách xác nhận rằng việc ngắt kết nối đến từ máy chủ.
Twister

netstat -apnc cung cấp cho bạn tổng kích thước gửi và nhận hàng đợi trên Linux. Nếu máy chủ đặt bộ đệm ở mức tối đa khả dụng và bạn vẫn đang bão hòa thì có thể bạn cần cài đặt bộ đệm cao hơn ở cấp HĐH
Karlson

Câu trả lời:


7

sk_forward_alloc là bộ nhớ được phân bổ chuyển tiếp, là tổng bộ nhớ hiện có trong hạn ngạch của ổ cắm.

sk_wmem_queued là dung lượng bộ nhớ được sử dụng bởi bộ đệm gửi bộ đệm được xếp hàng đợi trong hàng đợi truyền và chưa được gửi đi hoặc chưa được xác nhận.

Bạn có thể tìm hiểu thêm về Quản lý bộ nhớ TCP trong chương 9 của Kiến trúc, thiết kế và triển khai TCP / IP trong Linux của Sameer Seth, M. Ajaykumar Venkatesulu


Tôi không hiểu định nghĩa này sk_wmem_queuedkhác với như thế nào sk_wmem_alloc, bạn có thể mở rộng một chút về điều này không? (Nếu bạn biết câu trả lời, vui lòng thêm câu trả lời cho câu hỏi này: unix.stackexchange.com/questions/551444/ chủ )
little-dude

1

Xem trang người đàn ông của ss.

<fwd_alloc>
   The  memory allocated by the socket as cache, but not used for receiving/sending packet yet. If need memory to send/receive packet, the memory in this cache will be used before allocate additional memory.

<wmem_queued>
   The memory allocated for sending packet (which has not been sent to layer 3)

0

Về sk_wmem_queuedsk_wmem_alloc, tôi đã hỏi cùng một câu hỏi vì vậy tôi sẽ sao chép câu trả lời ở đây:

Tôi đã gửi email cho Eric Dumazet, người đóng góp cho ngăn xếp mạng Linux và đây là câu trả lời:

sk_wmem_alloctheo dõi số lượng byte cho skb được xếp hàng sau khi xếp chồng vận chuyển: lớp qdisc và bộ đệm vòng NIC TX.

Nếu bạn có 1 MB dữ liệu trong hàng đợi ghi TCP, chưa được gửi (giới hạn cwnd), sk_wmem_queuesẽ có khoảng 1 MB, nhưng sk_wmem_allocsẽ có khoảng 0

Một tài liệu rất tốt để hiểu ba loại hàng đợi này (bộ đệm ổ cắm, hàng đợi qdisc và hàng đợi thiết bị) là bài viết này (khá dài) . Tóm lại, ổ cắm bắt đầu bằng cách đẩy các gói trực tiếp vào hàng đợi qdisc, chuyển tiếp chúng đến hàng đợi thiết bị. Khi hàng đợi qdisc đầy, ổ cắm bắt đầu đệm dữ liệu trong hàng đợi ghi của chính nó.

ngăn xếp mạng đặt các gói trực tiếp vào kỷ luật xếp hàng hoặc nếu không sẽ đẩy lùi các lớp trên (ví dụ: bộ đệm ổ cắm) nếu hàng đợi đầy

Về cơ bản: sk_wmem_queueslà bộ nhớ được sử dụng bởi bộ đệm socket ( sock.sk_write_queue) trong khi sk_wmem_alloclà bộ nhớ được sử dụng bởi các gói trong hàng đợi qdisc và thiết bị.

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.