开发内功修炼@张彦飞开发内功修炼@张彦飞

talk is cheap,
show me the code!

漫画 | 花了七天时间测试,我彻底搞明白了 TCP 的这些内存开销!

实际中 TCP 连接上肯定是要进行数据的收发的,而且还会有 TIME_WAIT 等其它状态。在这些复杂情况下,一条连接占用多大内存呢?飞哥用做了七天的实验结果告诉你!

test0_1.png

test0_2.png

test0_3.png

实验1: ESTABLISH空连接

test1_1.png

test1_2.png

test1_3.png

图1.png

test1_4.png

实验2:客户端 => 服务器发送数据测试

test2_1.png

test2_2.png

图2.png

test2_5.png

test2_3.png

test2_4.png

实验3: 服务器 => 客户端发送数据测试

test3_1.png

test3_2.png

test3_3.png

图3.png

test3_4.png

test3_5.png

test3_6.png

实验4: 非 ESTABLISH 状态

test4_1.png

test4_2.png

huishou.png

test4_3.png

图4.png

test4_4.png

总结

我们把实验中的数据来总结一下

summary.png

可见,内核在 socket 内存开销优化上采取了不少方法

    1. 内核会尽量及时回收发送缓存区、接收缓存区,但高版本做的更好
    1. 发送接收缓存区最小并不一定是 rmem 内核参数里的最小值,实际可能会更小
    1. 其它状态下,例如对于TIME_WAIT还会回收非必要的 socket_alloc 等对象

开发内功修炼之网络篇专辑:

写在最后,由于我的这些知识在公众号里文章比较分散,很多人似乎没有理解到我对知识组织的体系结构。而且图文也不像视频那样理解起来更直接。所以我在知识星球上规划了视频系列课程,包括硬件原理、内存管理、进程管理、文件系统、网络管理、Golang语言、容器原理、性能观测、性能优化九大部分大约 120 节内容,每周更新。加入方式参见我要开始搞知识星球啦如何才能高效地学习技术,我投“融汇贯通”一票

Github:https://github.com/yanfeizhang/coder-kung-fu
关注公众号:微信扫描下方二维码
qrcode2_640.png

本原创文章未经允许不得转载 | 当前页面:开发内功修炼@张彦飞 » 漫画 | 花了七天时间测试,我彻底搞明白了 TCP 的这些内存开销!