一个unix 域socket,平时我们用ss -auxp 来查看是否有数据在内核没有到用户态,

[root@localhost unix]#  ss -auxp |grep -i server.o
u_str LISTEN 0 20 server.socket 59714016 * 0 users:(("server.o",pid=45578,fd=7))
u_str ESTAB 0 0 * 59169156 * 59169157 users:(("server.o",pid=45578,fd=3),("gdb",pid=45482,fd=3))
u_str ESTAB 0 0 * 59169157 * 59169156 users:(("server.o",pid=45578,fd=4),("gdb",pid=45482,fd=4))
u_str ESTAB **9** 0 server.socket 59714017 * 59682769 users:(("server.o",pid=45578,fd=8))

比如最后一行的9,就说明有9个字节的数据还在内核中,没有recv。

那么,当看到为0的时候,是不是说明一定不在内核中呢?答案是否定的。

同样的环境,我们将unix_diag模块卸载掉,然后重新读取,发现还是能看到 :

[root@localhost /]# lsmod |grep unix
unix_diag 12601 0 [root@localhost unix]# rmmod unix_diag
[root@localhost unix]#
[root@localhost unix]#
[root@localhost unix]# lsmod |grep unix_diag

然后卸载之后,再用ss去查看一下,发现输出没有变化:

[root@localhost unix]#  ss -auxp |grep -i server.o
u_str LISTEN 0 20 server.socket 59714016 * 0 users:(("server.o",pid=45578,fd=7))
u_str ESTAB 0 0 * 59169156 * 59169157 users:(("server.o",pid=45578,fd=3),("gdb",pid=45482,fd=3))
u_str ESTAB 0 0 * 59169157 * 59169156 users:(("server.o",pid=45578,fd=4),("gdb",pid=45482,fd=4))
u_str ESTAB **9** 0 server.socket 59714017 * 59682769 users:(("server.o",pid=45578,fd=8))

这个时候查看一下模块,发现又被加载进去了,

[root@localhost /]# lsmod |grep unix
unix_diag 12601 0

原来ss会去加载对应的 unix_diag模块。

我们将 mv unix_diag.ko.xz unix_diag.ko.xz_bak ,改名,然后再次获取:

[root@localhost unix]# ss -auxp |grep -i server.o
u_str ESTAB 0 0 * 59169156 * 0 users:(("server.o",pid=45578,fd=3),("gdb",pid=45482,fd=3))
u_str ESTAB 0 0 * 59169157 * 0 users:(("server.o",pid=45578,fd=4),("gdb",pid=45482,fd=4))
u_str LISTEN 0 0 server.socket 59714016 * 0 users:(("server.o",pid=45578,fd=7))
u_str ESTAB **0** 0 server.socket 59714017 * 0 users:(("server.o",pid=45578,fd=8))

发现读不到数据了,最后一行从9 变成了0.

因为unix域的数据在ss中展示,需要读取:

sk_diag_show_rqlen 这个函数,而如果没有加载 unix_diag,则会默认显示为0.

对于大量使用unix域通信的os,建议默认开启: CONFIG_UNIX_DIAG

ss 显示unix 域 的socket 缓冲区不正确的更多相关文章

  1. Linux IPC udp/tcp/UNIX域 socket编程

    UNIX域套接字本地通信即在socket第一个参数中选择AF_LOCAL,socket是BSD提出的一种适用于所有的情况的进程间通信的方式,虽然现在多用于网络通信,但是本机内的进程间通信也是没有问题的 ...

  2. Socket编程实践(13) --UNIX域协议

    UNIX域协议 UNIX域套接字与TCP相比, 在同一台主机上, UNIX域套接字更有效率, 几乎是TCP的两倍(由于UNIX域套接字不需要经过网络协议栈,不需要打包/拆包,计算校验和,维护序号和应答 ...

  3. unix域源码解析

    首先我们先要创建一个用于通信的结构unix_proto_data ,并初始化某些字段 static int unix_proto_create(struct socket *sock, int pro ...

  4. ss命令结合zabbix对socket做监控

    本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 最近天冷了,socket也出问题了,一直没有做监控,现在就把监控加起来,目前我们使用的有z ...

  5. 《Unix 网络编程》15:Unix 域协议

    Unix 域协议 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ 本 ...

  6. Socket缓冲区探讨,是否有拆包的方式?

    Socket缓冲区探讨 本文主要探讨java网络套接字传输模型,并对如何将NIO应用于服务端,提高服务端的运行能力和降低服务负载. 1.1 socket套接字缓冲区 Java提供了便捷的网络编程模式, ...

  7. UNIX域协议(命名套接字)

    这里主要介绍命名UNIX域套接字 1.什么是UNIX域套接字Unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务通信的一种方式.是进程间通信(IPC)的一种方式.它提供了两类套接字:字 ...

  8. UNIX域协议(无名套接字)

    关于什么是UNIX域套接字可以参考:http://www.cnblogs.com/xcywt/p/8185597.html这里主要介绍非命名的UNIX域套接字的用法.1.socketpair函数先看m ...

  9. UNIX网络编程——Socket通信原理和实践

    我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠so ...

随机推荐

  1. sklearn练习1 回归

    from sklearn.svm import SVR from sklearn.pipeline import make_pipeline from sklearn.preprocessing im ...

  2. LVGL库入门教程01-移植到STM32(触摸屏)

    LVGL库移植STM32 LVGL库简介 LVGL(Light and Versatile Graphics Library)是一个免费.开源的嵌入式图形库,可以创建丰富.美观的界面,具有许多可以自定 ...

  3. Winforms选择文件夹、文件

    更新记录: 2022年5月28日 初始记录 选择文件夹 if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK) { //获得用户选 ...

  4. 一分钟入门 Babel(下一代 JavaScript 语法的编译器)

    简单来说把 JavaScript 中 es2015/2016/2017/2046 的新语法转化为 es5,让低端运行环境(如浏览器和 node )能够认识并执行.严格来说,babel 也可以转化为更低 ...

  5. RPA人力资源简历筛选机器人

    简历自动筛选及分析机器人,支持前程无忧.猎聘 1.自动登录招聘网站 2.自动填充简历筛选条件 3.RPA依次读取所筛选的简历信息 4.自动将简历数据复制到本地文档中 5.完成简历信息收集及分析表 6. ...

  6. Linux shell环境的配置

    shell配置文件分类 按生效范围分类:全局和局部 按登录方式分类:交互式和非交互式 按功能分类:profile和bashrc shell配置文件按生效范围分类: 全局配置:针对有所用户有效 /etc ...

  7. Redis docker 主从模式与哨兵sentinel

    更多技术记录,请参考软件开发 | 编程 | RustFisher 为实现redis的高可用,我们采用主从模式加哨兵的方法. 一主二从三哨兵,共启动6个redis容器.本文示例在同一个服务器上进行操作. ...

  8. Java中Double类型数据比较大小

    方法一:转成字符串之后比较 如果要比较的两个double数据的字符串精度相等,可以将数据转换成string然后借助string的equals方法来间接实现比较两个double数据是否相等.注意这种方法 ...

  9. adb工具

    ADB:全称为Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具.   首先,下载ADB工具并安装:   下载:百度就有.下载后是个压缩包,将其拷贝到cm ...

  10. go-zero微服务实战系列(十、分布式事务如何实现)

    在分布式应用场景中,分布式事务问题是不可回避的,在目前流行的微服务场景下更是如此.比如在我们的商城系统中,下单操作涉及创建订单和库存扣减操作两个操作,而订单服务和商品服务是两个独立的微服务,因为每个微 ...