Nhận số lượng kết nối TCP hiện tại trên một hệ thống


22

Thay vì làm wc -l /proc/net/tcp, có cách nào nhanh hơn không?

Tôi chỉ cần tổng số kết nối tcp.


5
Có thể thửss -s
Ulrich Dangel

@UlrichDangel tuyệt vời, nhanh hơn, bằng cách đọc sockstat; bạn thực sự có thể đặt nó trong vùng trả lời ;-)
daisy

Câu trả lời:


20

Nếu bạn chỉ muốn lấy số và không cần bất kỳ chi tiết nào bạn có thể đọc dữ liệu từ đó /proc/net/sockstat{,6}. Xin lưu ý rằng bạn phải kết hợp cả hai giá trị để có được số lượng kết nối tuyệt đối.

Nếu bạn muốn lấy thông tin từ chính kernel, bạn có thể sử dụng NETLINK_INET_DIAGđể lấy thông tin từ kernel mà không cần phải đọc nó từ/proc


1
Tôi sẽ tò mò xem thử nghiệm trên một hệ thống có nhiều kết nối so sánh hiệu suất của giải pháp của tôi với giải pháp được đề xuất ở trên, yêu cầu số học và lọc bổ sung để có câu trả lời cuối cùng, chỉ là một con số!
Johan

7

Một cách nhanh hơn? Cách đó tạo ra câu trả lời trong một phần của giây, trên thực tế, nó mất 0,009 giây trên máy tính của tôi!

Bạn đang tìm kiếm một cách đòi hỏi ít gõ? Trong trường hợp đó, đặt bí danh, ví dụ:

alias tcpcount="wc -l /proc/net/tcp"

Bây giờ bạn có thể chỉ cần nhập bí danh, ví dụ như tcpcountnhững gì tôi đã sử dụng trong ví dụ của mình, để có được số này.

Nhập dòng hoặc thêm nó vào .bashrc của bạn để bí danh được xác định mỗi khi bạn đăng nhập.

Đối với số lượng lớn kết nối, các kết nối sau có thể chạy nhanh hơn một chút (Và chậm hơn một chút đối với số lượng kết nối rất nhỏ):

#!/bin/bash
/usr/bin/tail -1 /proc/net/tcp | (IFS=:
read COUNT DISCARD
echo $COUNT
)

Hoặc có thể ...

awk 'END {print NR}' /proc/net/tcp

Cả hai giải pháp này đều cho rằng "wc" không tối ưu cho việc chỉ đếm số lượng dòng. Thử nghiệm của tôi cho thấy giả định này là đúng.

Công cụ đầu tiên dựa trên tiền đề rằng lệnh tail thực sự rất tốt trong việc loại bỏ dữ liệu không cần thiết, đến mức nó bù cho việc tạo một lớp vỏ phụ và thực hiện thêm công việc trên các biến môi trường. Nó thúc đẩy thực tế là các dòng trong / Proc / net / tcp đã được đánh số để loại bỏ sự cần thiết phải đếm các dòng. Giải pháp cuối cùng giả định rằng awk đủ tốt để bù đắp bất kỳ nhược điểm nào do tải một chương trình lớn hơn so với việc tạo nhiều quy trình. Giải pháp awk có thêm lợi ích là nó phù hợp với định nghĩa bí danh một dòng đơn giản (mang lại lợi ích bổ sung trong đó không có tập lệnh nào được gọi, do đó không có quá trình shell bổ sung nào được chia rẽ, mang lại lợi thế cho mili giây.)


1
Tôi có kết nối 40k + trong đó mất hơn 3 giây
daisy

2
Hmm, tôi không nghĩ có cách nào nhanh hơn đọc từ đó /proc/net/tcp. Bạn có thể thử netstat -n -t | wc -l, nhưng tôi đoán là netstat cũng đọc từ/proc/net/tcp
Kotte

netstat chậm hơn 3 lần so với đọc / Proc / net / tcp trên hệ thống của tôi, nhưng đó là với số lượng kết nối rất nhỏ, do đó có thể một số chi phí khởi động bị giảm nếu số lượng kết nối lớn. netstat giúp dễ dàng có được số lượng kết nối ở các trạng thái khác nhau ....
Johan

1
Trên một máy chủ có RAM 16 GB, giờ chỉ mất hơn một phút để thực hiện netstat -ntvới khoảng 180.000 kết nối. Tôi thấy không có lý do tại sao nó phải chậm như vậy ... (đọc /proc/net/tcpcũng rất chậm)
Marki555

1
Một số thử nghiệm ngại ngùng trên một máy có kết nối 180k cho thấy awkcách tiếp cận chậm hơn so với wc. tailcó vẻ là ngang bằng với wc.
Felix Frank

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.