请教:关于使用ss网络工具比netstat快的本质原因?
查了下别人说的,主要是说的是:使用procfs和ioctl系统调用,访问和更改内核,比通过网络链路套接字接口与内核交互更改要慢。我比较不懂的是,前面的形式为啥比后面慢呢?根本原因是为啥? 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参数,记录了上一次遍历到什么位置,这样效率就要好很多。
简单的可以理解为支持断点续传和不支持断点续传的区别。(严格说不是那么确切的比喻) 回复 2# nswcfd
赞一个!
可是我使用ss 这个工具感受不到这个“断点续传“的效果哦,我第一次执行ss也是很快的哦。回复 2# nswcfd
哦,这个比喻果然引起的歧义更大一些。
本意不是指在两次ss或netstat之间的“续传”,而是指一次ss/netstat内部不同的sys_read或者sys_recv之间的“续传”。
页:
[1]