最多能创建多少个 TCP 连接?( 三 )


最多能创建多少个 TCP 连接?

文章插图
 
我一脸疑惑,"啥是 IO 多路复用啊?" 。
老操一脸鄙视,"你这... 你去看看闪客的《你管这破玩意叫 IO 多路复用》,就明白了 。"
这次真是大开眼界了,我赶紧把代码改成了这种 IO 多路复用的模型,将原来的 TCP 连接销毁掉,改成同一个线程管理多个 TCP 连接,很快,操作系统老大就恢复了以往的办事效率,同时我的 TCP 连接数又多了起来 。
 
内存 
突破了端口号、文件描述符、线程数等重重限制的我,再次肆无忌惮地创建起了TCP连接 。
直到有一次,我又收到了一张红牌 。
最多能创建多少个 TCP 连接?

文章插图
 
嗨,又是啥东西限制了呀,改了不就完了 。我不耐烦地问老操,"这回又是啥毛病?"
老操说道 。"这个错误叫内存溢出,每个TCP连接本身,以及这个连接所用到的缓冲区,都是需要占用一定内存的,现在内存已经被你占满了,不够用了,所以报了这个错 。"
最多能创建多少个 TCP 连接?

文章插图
 
我看这次老操特别耐心,也没多说什么,但想着被内存限制住了,有点不太开心,于是我让老操帮我最后一个忙 。
"老操呀,帮小进我最后一个忙吧,你权利大,你看看把那些特别占内存的进程给杀掉,给我腾出点地方,我今天要完成我的梦想,看看TCP连接数到底能创建多少个!"
老操见我真的是够拼的,便答应了我,杀死了好多进程,我很是感动 。
 
CPU 
有了老操为我争取的内存资源,我又开始日以继日地创建TCP连接 。
老操也不再说什么,同样日以继日地执行着我的指令 。
有一次,老操语重心长地对我说,"差不多了,我劝你就此收手吧,现在 CPU 的占用率已经快到 100% 了 。"
最多能创建多少个 TCP 连接?

文章插图
 
我觉得老操这人真的可笑,经过这几次的小挫折,我明白了只要思想不滑坡,方法总比苦难多,老操这人就是太谨慎了,我岂能半途而废,不管他 。
我仍然继续创建着 TCP 连接 。
直到有一天,老操把我请到一个小饭馆,一块吃了顿饭,吃好后说道 。"咱哥俩也算是配合了很久啦,今天我是来跟你道个别的 。"
我很不解地问,"怎么了老操,发生什么事了? 。"
老操说,"由于你的 TCP 连接,CPU 占用率已经很长时间维持在 100%,我们的使用者,也就是我们的上帝,几乎什么事情都做不了了,连鼠标动一下都要等好久,所以他给我下达了一个重启的指令,我执行这个指令后,你,以及像你一样的所有进程,包括我这个操作系统本身,一切都就消失了 。"
我大惊失色,"啊,这么突然么?这条指令什么时候执行?"
老操缓缓起身,"就现在了,刚刚这条指令还没得到 CPU 运行的机会,不过现在到了 。"
突然,我眼前一黑,一切都没了 。
 
总结 
最多能创建多少个 TCP 连接?

文章插图
 
资源
一台Linux服务器的资源
一个TCP连接占用的资源
占满了会发生什么
CPU
看你花多少钱买的
看你用它干嘛
电脑卡死
内存
看你花多少钱买的
取决于缓冲区大小
OOM
临时端口号
ip_local_port_range
1
cannot assign requested address
文件描述符
fs.file-max
1
too many open files
进程线程数
ulimit -n
看IO模型
系统崩溃
 
后记其实这个问题,我觉得结论不重要,最重要的是思考过程 。
而思考过程其实相当简单,就是,寻找限制条件而已,其实一开始这篇文章,我写了个故事在开头,但后来感觉放在后记更合适 。故事是这样的 。
闪客:小宇,我问你,你一天最多能吃多少个汉堡?
小宇:额,你这问的太隐私了吧,不过看在你教我技术的份上,我就告诉你,最多能吃 4 个左右吧 。
闪客:咳咳真的么?好吧,那你一分钟最多能吃多少个汉堡?
小宇:快的话可能 2 个,不过正常应该最多就能吃完 1 个了 。
闪客:好的,那我问你,刚刚这两个问题你为什么能不假思索地回答出来呢?


推荐阅读