Công thức để xác định ổ cắm tiêu thụ bao nhiêu bộ nhớ trong Linux?


11

Tôi đang thực hiện một số kế hoạch dung lượng và tôi đã tự hỏi liệu có một công thức mà tôi có thể sử dụng để dự đoán (từ quan điểm bộ nhớ) có bao nhiêu kết nối TCP tôi có thể xử lý trên máy chủ của mình. Hiện tại, tôi chỉ quan tâm đến các yêu cầu về bộ nhớ.

Một số biến mà tôi nghĩ sẽ hiển thị trong công thức là:

  • sysctl's net.ipv4.tcp_wmem(giá trị tối thiểu hoặc mặc định)
  • sysctl's net.ipv4.tcp_rmem(giá trị tối thiểu hoặc mặc định)
  • kích thước của sock, sock_common, proto và các cấu trúc dữ liệu trên mỗi ổ cắm khác.

Tôi không chắc chắn bao nhiêu tcp_wmem và tcp_rmem được phân bổ thực sự và khi nào bộ nhớ được phân bổ. Tại thời điểm tạo ổ cắm? Theo yêu cầu?

Câu trả lời:


2

Nếu bạn có thể sửa đổi mã nguồn, sau đó sử dụng dữ liệu rusage để đo RSS và ghi lại có bao nhiêu kết nối TCP đang hoạt động tại thời điểm đo.

Nếu mã nguồn không thể thay đổi, thì hãy sử dụng RSS của ứng dụng mạng như được báo cáo bởi top hoặc ps và lấy số lượng kết nối mạng tại thời điểm đo lsof -i.

Thu thập dữ liệu này mỗi phút trong khi ứng dụng của bạn di chuyển qua mức tải cao nhất và từ dữ liệu đó, bạn có thể đưa ra một công thức liên quan đến số lượng kết nối với việc sử dụng RAM.

Tất nhiên còn nhiều thứ nữa mà bạn có thể đo được, đặc biệt là bạn có thể muốn đo mức sử dụng RAM kernel, mặc dù cấu trúc dữ liệu tcp nên được dự đoán trước và có thể tính toán được. Trong mọi trường hợp, hãy xem câu hỏi này /server/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server để biết thêm thông tin về điều chỉnh TCP và làm thế nào để có cái nhìn rõ ràng về những gì đang xảy ra trong ngăn xếp mạng.


Cảm ơn bạn đã đo lường căng thẳng và chỉ cho tôi các liên kết chỉ ra cách thu thập các số liệu đó!
Tim Stewart

8

tcp_mem quan trọng hơn vì nó xác định cách hoạt động của ngăn xếp tcp khi sử dụng bộ nhớ. Bộ đệm gửi và nhận IMO phải là bội số của tcp_mem. Đây là một liên kết đến một công thức để nhận bộ đệm: http://www.acc.umu.se/~maswan/linux-netperf.txt . Nói ngắn gọn:

Chi phí hoạt động là: window / 2 ^ tcp_adv_win_scale (tcp_adv_win_scale mặc định là 2) Vì vậy, đối với các tham số mặc định của linux cho cửa sổ nhận (tcp_rmem): 87380 - (87380/2 ^ 2) = 65536. Cho một liên kết hiệu suất tối đa kết thúc tại: 65536 / 0.150 = 436906 byte / s hoặc khoảng 400 kbyte / s, ngày nay rất chậm. Với kích thước mặc định tăng: (873800 - 873800/2 ^ 2) /0.150 = 4369000 byte / s, hoặc khoảng 4Mbyte / s, có thể cộng hưởng cho một mạng hiện đại. Và lưu ý rằng đây là mặc định, nếu người gửi được định cấu hình với kích thước cửa sổ lớn hơn, nó sẽ hạnh phúc mở rộng gấp 10 lần số này (8738000 * 0,75 / 0,150 = ~ 40Mbyte / giây), khá tốt cho mạng hiện đại.

Đây là những gì bài báo nói về tcp_mem:

Những gì bạn loại bỏ là một giới hạn nhân tạo đối với hiệu suất tcp, không có giới hạn đó, bạn bị giới hạn bởi băng thông đầu cuối có sẵn và mất mát. Vì vậy, bạn có thể sẽ bão hòa đường lên của bạn hiệu quả hơn, nhưng tcp rất tốt trong việc xử lý việc này.

IMO một giá trị tcp_mem ở giữa lớn hơn sẽ tăng tốc kết nối khi mất ít bảo mật hơn và tăng nhẹ khả năng sử dụng bộ nhớ.

Bạn có thể theo dõi ngăn xếp mạng với:

grep skbuff /proc/slabinfo

1
Cảm ơn các phản hồi thông tin. Nó cho thấy tôi cần học bao nhiêu về mạng.
Tim Stewart

1

David đã cung cấp một câu trả lời rất hay cho câu hỏi khi được hỏi, tuy nhiên trừ khi bạn độc quyền sử dụng các LFN , thì ngay cả trên máy chủ dựa trên sự kiện, bộ đệm TCP có thể chỉ là một phần nhỏ của dấu chân trên mỗi kết nối.

Để lập kế hoạch dung lượng, không có sự thay thế nào cho việc kiểm tra máy chủ và tính toán hồi quy của việc sử dụng bộ nhớ theo tải.


Cảm ơn, thật tuyệt khi một công thức đơn giản sẽ làm, nhưng có những lúc bạn chỉ cần đo.
Tim Stewart
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.