如何查看 unix 域套接字上待处理的数据量?

e27*_*314 3 tmux socket

当我tmux从两台不同的计算机登录到会话时,我希望能够跟踪两个tmux会话的套接字上待处理的数据量。为了测试这一点,我登录到计算机A和计算机B,然后从计算机上B使用 ssh 登录到计算机A。我从每个控制台附加到同一个tmux会话并开始运行一个脚本,该脚本打印从 1 到 100M 的迭代次数。事实上,我发现本地 ( ) 控制台中打印的迭代次数A大于远程控制台 ( B) 中打印的迭代次数,因为消息传输到远程计算机需要时间

[user@server00 ~]$ lsof | grep tmux | grep unix
tmux      1073     user    4u     unix 0xf6dc2ac0       0t0   18681 socket
tmux      1073     user    5u     unix 0xf6dc3840       0t0   18682 socket
tmux      1073     user    6u     unix 0xf137ed00       0t0   19768 socket
tmux      1073     user    7u     unix 0xf6dc2880       0t0   18683 /tmp/tmux-1000/default
tmux      1073     user    8u     unix 0xf6cbcd80       0t0   22647 /tmp/tmux-1000/default
tmux      1073     user   14u     unix 0xf137ef40       0t0   12146 /tmp/tmux-1000/default
tmux      1092     user    4u     unix 0xf6cbd200       0t0   24848 socket
tmux      1092     user    5u     unix 0xf6cbef40       0t0   24849 socket
tmux      1092     user    6u     unix 0xf6cbed00       0t0   24850 socket
tmux      1177     user    4u     unix 0xf137fcc0       0t0   19947 socket
tmux      1177     user    5u     unix 0xf137fa80       0t0   19948 socket
tmux      1177     user    6u     unix 0xf137c240       0t0   19949 socket
[user@server00 ~]$ netstat -a | grep tmux
unix  2      [ ACC ]     STREAM     LISTENING     18683    /tmp/tmux-1000/default
unix  3      [ ]         STREAM     CONNECTED     12146    /tmp/tmux-1000/default
unix  3      [ ]         STREAM     CONNECTED     22647    /tmp/tmux-1000/default
Run Code Online (Sandbox Code Playgroud)

因为我只看到 的路径,所以/tmp/tmux-1000/default我希望看到它的大小增加,但它的大小始终为 0

[user@server00 ~]$ ls -l /tmp/tmux-1000/default
srwxrwx---. 1 user user 0 Feb  9 10:45 /tmp/tmux-1000/default
Run Code Online (Sandbox Code Playgroud)

如何查看套接字上待处理的数据,以及如何知道套接字是否变得拥塞?

Bob*_*tle 6

恐怕 slm 的答案(当前标记为正确)在许多方面都是不正确的。

首先,OP 询问是否有一种方法可以从外部判断进程是否有 AF_UNIX 套接字上待处理的数据。slm的答案需要修改流程本身。一般来说,netstat 在外部检查您无法控制其行为的进程时很有用。了解进程是否有未读数据很有用,这可以表明该进程没有通过读取正确为其套接字提供服务(即可能有错误,或配置错误,或线程已死亡)。

其次,slm 表明即使在进程内也无法执行此操作,除非读取套接字直到它为空。也错了。进程可以使用SIOCINQ/FIONREADioctl 来检测套接字中待处理的数据量,而无需读取它(我更喜欢FIONREAD,因为它在更多上下文中意味着相同的事情,因此比SIOCINQ特定于套接字的 更普遍地被识别)。请参阅 unix(7) 手册页

最后,在 Linux 上,实际上有一种方法可以通过使用程序ss而不是netstat. ss -ax会成功的。这有点像netstat类固醇。请参阅 ss(8) 手册页

参考