linux内核与netlink有关的两个坑

8 篇文章 0 订阅
5 篇文章 0 订阅

最近做一些与netfilter/ulogd2性能调优有关的工作(https://github.com/InsZVA/ulogd-with-syslog-tcp),在过程中发现了两个内核概念理解的坑点。


第一个问题是下面代码:


```c
len = recv(fd, ui->nfulog_buf, bufsiz_ce(upi->config_kset).u.value, 0);
```


这个是处理NFLOG包的代码,传入的缓冲区nfulog_buf大小为150000,应该算很大了,但是我发现有时候fd所代表的netlink socket的缓冲区里面明明都有很多
内容,但是len返回的总是很小,不愿意填满nfulog_buf。然后我试图阅读内核源码,使用Systemtap等方法去寻找原因,最后发现它是调用了`skb_recv_datagram`,
这个函数只会拿出一个skb,一个报文,然后recv调用返回。然后我发现UDP也是这样,,,才发现自己好智障。。。datagram类型的根本就不会填满缓冲区啊,它是
一个一个的包,只有tcp那种stream类型的,才会填满缓冲区。。。


第二个问题是我这个程序,在跑一个较低负载的时候,可以看到user: 40% sys: 4% soft: 30% schd: 26%这样的数据,软中断占用很多,但是当他高负载运行的时候,
他就是user: 100%,soft等等都变成0了。。如果我只开iptables,然后发大量包,那么就是user: 0% sys: 0% soft:100%。这就感觉很假。


后来偶然看到一篇与这个无关的博客(http://blog.csdn.net/dog250/article/details/48770481)说软中断可能发生在硬中断之后的用户线程上下文,这样会被top之类
统计到user里面去,这才弄明白。软中断触发的时机不仅仅有可能在内核线程,也有可能在用户线程,而%soft统计的只是ksoftirqd占用的cpu。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值