รับจำนวนการเชื่อมต่อ TCP ปัจจุบันบนระบบ


22

แทนที่จะทำwc -l /proc/net/tcpอย่างนั้นมีวิธีที่เร็วกว่าในการทำมันไหม

ฉันต้องการจำนวนการเชื่อมต่อ tcp ทั้งหมด


5
อาจจะลองss -s
Ulrich Dangel

@UlrichDangel เจ๋งเร็วขึ้นโดยการอ่าน sockstat; คุณสามารถใส่มันในพื้นที่คำตอบ ;-)
daisy

คำตอบ:


20

หากคุณต้องการรับหมายเลขและไม่ต้องการรายละเอียดใด ๆ คุณสามารถอ่านข้อมูล/proc/net/sockstat{,6}ได้ โปรดทราบว่าคุณต้องรวมค่าทั้งสองเพื่อรับจำนวนการเชื่อมต่อที่แน่นอน

หากคุณต้องการรับข้อมูลจากเคอร์เนลคุณสามารถใช้ NETLINK_INET_DIAGเพื่อรับข้อมูลจากเคอร์เนลโดยไม่ต้องอ่าน/proc


1
ฉันอยากรู้อยากเห็นการทดสอบบนระบบที่มีการเชื่อมต่อจำนวนมากเปรียบเทียบประสิทธิภาพของโซลูชันของฉันกับโซลูชันที่แนะนำข้างต้นซึ่งต้องใช้เลขคณิตและตัวกรองเพิ่มเติมเพื่อรับคำตอบสุดท้ายซึ่งเป็นเพียงตัวเลขเดียว!
Johan

7

วิธีที่เร็วกว่า? ด้วยวิธีนี้จะสร้างคำตอบในเสี้ยววินาทีในความเป็นจริงมันใช้เวลา 0.009 วินาทีในคอมพิวเตอร์ของฉัน!

คุณกำลังมองหาวิธีที่ต้องการการพิมพ์น้อยลงหรือไม่? ในกรณีนั้นให้ตั้งชื่อแทนเช่น

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

ตอนนี้คุณสามารถป้อนชื่อนามแฝงเช่นtcpcountสิ่งที่ฉันใช้ในตัวอย่างของฉันเพื่อรับหมายเลขนี้

ป้อนบรรทัดหรือเพิ่มลงใน. bashrc ของคุณเพื่อให้นามแฝงได้รับการกำหนดทุกครั้งที่คุณเข้าสู่ระบบ

สำหรับการเชื่อมต่อจำนวนมากต่อไปนี้อาจทำงานได้เร็วขึ้นเล็กน้อย (และช้าลงเล็กน้อยสำหรับการเชื่อมต่อจำนวนน้อยมาก):

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

หรืออาจจะ ...

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

โซลูชันทั้งสองนี้สันนิษฐานว่า "wc" นั้นไม่เหมาะสมที่สุดเพียงแค่นับจำนวนบรรทัด การทดสอบของฉันแสดงให้เห็นว่าสมมติฐานนี้เป็นจริง

การทำงานครั้งแรกในสถานที่ตั้งที่คำสั่ง tail เป็นสิ่งที่ดีในการทิ้งข้อมูลที่ไม่จำเป็นดังนั้นมันจึงสร้างขึ้นสำหรับการสร้าง sub-shell พิเศษและทำงานพิเศษกับตัวแปรสภาพแวดล้อม มันใช้ประโยชน์จากความจริงที่ว่าบรรทัดใน / proc / net / tcp นั้นมีหมายเลขอยู่แล้วเพื่อขจัดความจำเป็นในการนับบรรทัด ทางออกสุดท้ายสมมติว่า awk นับได้ดีพอที่จะชดเชยข้อเสียใด ๆ เนื่องจากการโหลดโปรแกรมที่ใหญ่กว่าและสร้างกระบวนการหลาย ๆ กระบวนการ โซลูชัน awk มีประโยชน์เพิ่มเติมที่เหมาะสมกับคำนิยามนามแฝงแบบบรรทัดเดียว (ซึ่งให้ประโยชน์เพิ่มเติมกับที่ไม่มีสคริปต์ที่เรียกว่าดังนั้นจึงไม่มีการประมวลผลเชลล์พิเศษแยกออกมาทำให้ได้เปรียบ mili-วินาทีเพิ่มเติม)


1
ฉันมีการเชื่อมต่อ 40k + ซึ่งใช้เวลามากกว่า 3 วินาที
daisy

2
อืมฉันไม่คิดว่าจะมีวิธีที่เร็วกว่าการอ่านจาก/proc/net/tcpมากนัก คุณสามารถลองnetstat -n -t | wc -lได้ แต่ฉันเดาว่า netstat นั้นอ่านได้จาก/proc/net/tcp
Kotte

netstat ช้ากว่าการอ่าน / proc / net / tcp มากกว่า 3 เท่าในระบบของฉัน แต่นั่นคือการเชื่อมต่อที่มีจำนวนน้อยมากดังนั้นอาจเป็นได้ว่าค่าใช้จ่ายในการเริ่มต้นระบบบางส่วนลดลงหากจำนวนการเชื่อมต่อมีขนาดใหญ่ netstat ทำให้การรับจำนวนการเชื่อมต่อในรัฐต่าง ๆ เป็นเรื่องง่าย ....
Johan

1
บนเซิร์ฟเวอร์ที่มี RAM 16 GB ขณะนี้ใช้เวลามากกว่าหนึ่งนาทีในการnetstat -ntเชื่อมต่อกับประมาณ 180.000 การเชื่อมต่อ ฉันไม่เห็นเหตุผลว่าทำไมมันควรช้ามาก ... (การอ่าน/proc/net/tcpช้ามาก)
Marki555

1
การทดสอบที่ขี้อายบนเครื่องที่มีการเชื่อมต่อ 180k บ่งชี้ว่าawkวิธีการนั้นช้ากว่าwcมาก น่าจะเป็นที่ตราไว้กับtail wc
เฟลิกซ์แฟรงค์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.