too many open files 与网络连接数量演示

本文以redis为例

1 redis-server 是个什么文件
too many open files 与网络连接数量演示_第1张图片

2 redis-server 运行时能调用的函数库
too many open files 与网络连接数量演示_第2张图片

3 redis-server 启动时
too many open files 与网络连接数量演示_第3张图片

4 运行redis-servrer调用execve函数
图片.png

5 加载linux 的函数库文件【当然它会加载所有引入的函数库,只能只截图一张】
too many open files 与网络连接数量演示_第4张图片
你可以清晰的看到它会读取elf文件,因为函数库即.so它也是elf文件的一种。
6 redis 进程关系
too many open files 与网络连接数量演示_第5张图片

too many open files 与网络连接数量演示_第6张图片
too many open files 与网络连接数量演示_第7张图片

7 启动服务后,进程创建/打开了哪些文件【在linux中不管管道文件,socket文件,目录,epoll函数创建的句柄他们都称为文件】
too many open files 与网络连接数量演示_第8张图片

PS:打印列出的COMMAND,PID,FD,USER,NAME啥意思?我怎么百度不到??? 在linux中你man lsof 就可以看到解释了,小朋友
too many open files 与网络连接数量演示_第9张图片
too many open files 与网络连接数量演示_第10张图片
too many open files 与网络连接数量演示_第11张图片
too many open files 与网络连接数量演示_第12张图片

8 进程内存数据查看
too many open files 与网络连接数量演示_第13张图片
too many open files 与网络连接数量演示_第14张图片

9 进程的内部网络数据
too many open files 与网络连接数量演示_第15张图片
各个文件的含义
too many open files 与网络连接数量演示_第16张图片
too many open files 与网络连接数量演示_第17张图片

网络状态st字段说明
too many open files 与网络连接数量演示_第18张图片
10的十六进制就是A

监听socket的相关状态
too many open files 与网络连接数量演示_第19张图片

redis进程使用监听socket情况
too many open files 与网络连接数量演示_第20张图片

10 accept 后 【你们喜欢称为客户端连接】客户端的连接【文件】长啥样?
too many open files 与网络连接数量演示_第21张图片

too many open files 与网络连接数量演示_第22张图片
too many open files 与网络连接数量演示_第23张图片
too many open files 与网络连接数量演示_第24张图片
它的连接状态为ESTABLEISH =1 ,大家可以看一下相关资料即TCP状态转移与三次握手的关系,我就没有必要在这里说了。
当它接收到客户端连接后,就会生成一个文件,并且该文件是有相应的数据的,毕竟它只是一个网络连接,如网络状态,对端地址,对应的node结点等数据,以及收发相关的缓冲区,

11 进程启动后在做什么
too many open files 与网络连接数量演示_第25张图片

进程运行后能创建多少个文件【它能支持多少个客户端连接】
too many open files 与网络连接数量演示_第26张图片

一般来说程序会动态的修改进程资源限制【如setrlimit函数调用后可进行修改,php就是posix_setrlimit】

下面拿php网络程序【跟语言没有关系】测试
too many open files 与网络连接数量演示_第27张图片

它已经创建的文件
too many open files 与网络连接数量演示_第28张图片

当我修改open files 为6时,启动
too many open files 与网络连接数量演示_第29张图片
此时它已经影响到bash进程了。

再调整参数
too many open files 与网络连接数量演示_第30张图片

too many open files 与网络连接数量演示_第31张图片
too many open files 与网络连接数量演示_第32张图片

大家可以看到,当我设置为5后,它就不能再创建更多的文件了【socket 网络连接accept函数调用时会创建文件并返回fd】
产生to open many fiels的错误[除了系统的限制之外,当系统资源紧张时也有可能产生此类问题,导致的结果就是无法再接收更多的客户端连接]

我这里只是使用了进程资源函数进行模拟演示。
一般来说进程是可以自行调整如redis,当你调整了open files相关参数【软硬限制或是ulimit,file-max配置redis都会自动的调整】

一般来说不建议手动去修改linux配置,建议进程自行设置ulimit。

你可能感兴趣的:(redis服务器后端)