jesnridy 发表于 2016-01-30 12:02

请教:关于使用ss网络工具比netstat快的本质原因?

查了下别人说的,主要是说的是:使用procfs和ioctl系统调用,访问和更改内核,比通过网络链路套接字接口与内核交互更改要慢。
我比较不懂的是,前面的形式为啥比后面慢呢?根本原因是为啥?

nswcfd 发表于 2016-02-01 11:16

netlink_dump遍历接口有些时候会比profs的遍历效率高一些。

比如10K的条目,每次read只能返回100,需要100次调用完成。

procfs的read是无状态的,前后两次read call没有直接因果关系,只能通过file offset来间接关联。
这样的话,第一次read 100,offset+=100,fs内部只有offset这么一个状态。
第二次读的时候,首先需要把offset=100转换为object,由于不存在直接的从offset到object的映射关系(内部结构通常不是线性数组),又需要从0开始遍历,
这样时间复杂度实际是O(N^2)的。
无论是rt_cache还是arp表、tcp socket表,很多功能的seq_file都有个XXX_first函数来完成这个从0开始的遍历。

相反的,netlink_dump接口,有专门的cb参数,记录了上一次遍历到什么位置,这样效率就要好很多。

简单的可以理解为支持断点续传和不支持断点续传的区别。(严格说不是那么确切的比喻)

Godbach 发表于 2016-02-01 11:28

回复 2# nswcfd

赞一个!




   

jesnridy 发表于 2016-02-01 17:20

可是我使用ss 这个工具感受不到这个“断点续传“的效果哦,我第一次执行ss也是很快的哦。回复 2# nswcfd


   

nswcfd 发表于 2016-02-04 10:42

哦,这个比喻果然引起的歧义更大一些。

本意不是指在两次ss或netstat之间的“续传”,而是指一次ss/netstat内部不同的sys_read或者sys_recv之间的“续传”。
页: [1]
查看完整版本: 请教:关于使用ss网络工具比netstat快的本质原因?