持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
什么是 C10K 问题?
引用一位掘友的文章可以看下,服务端经典的C10k问题(译)。
大概描述一下就是,在很多年以前计算机性能还不是很高的时候,随着互联网的发展,一些网站应用用户越来越多,随之而来的也带来了一些瓶颈的问题,就比如说一台服务器怎么同时维持1W的在线用户,同时为1W个客户端同时提供服务,也就是我们所说的C10K(1W client)问题,当然这个问题在现在可能不值得一提,但是当时的一些思想和问题的解决方法,还是值得我们现在去学习和思考的。
为什么我们需要修改操作系统的一些限制?
如果我们不管操作系统的一些东西,我们能维持多少 socket 连接呢?
在这里我做了一个实验
可以看到连接最多在1000 左右,再多就是too many open files , 为什么会是这样呢?
为什么会出现文件描述符过多的错误呢?
Linux中Too many open files 问题分析和解决
搜索了一下,发现是操作系统对每个程序打开的文件描述符 数量有所限制。
这些限制从哪里看呢?
ulimit -a
这些都是什么意思呢?
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-m: resident set size (kbytes) unlimited
-u: processes 31616
-n: file descriptors 1024
-l: locked-in-memory size (kbytes) 65536
-v: address space (kbytes) unlimited
-x: file locks unlimited
-i: pending signals 31616
-q: bytes in POSIX msg queues 819200
-e: max nice 0
-r: max rt priority 0
-N 15: unlimited
选项 含义
-a 显示当前系统所有的limit资源信息。
-H 设置硬资源限制,一旦设置不能增加。例如:ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。例如:ulimit – Sn 32;限制软资源,32 个文件描述符。
-c 最大的core文件的大小,以 blocks 为单位。例如:ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。
-f 进程可以创建文件的最大值,以blocks 为单位.例如:ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
-d 进程最大的数据段的大小,以Kbytes 为单位。例如:ulimit -d unlimited;对进程的数据段大小不进行限制。
-m 最大内存大小,以Kbytes为单位。例如:ulimit – m unlimited;对最大内存不进行限制。
-n 可以打开的最大文件描述符的数量。例如:ulimit – n 128;限制最大可以使用 128 个文件描述符
-s 线程栈大小,以Kbytes为单位。例如:ulimit – s 512;限制线程栈的大小为 512 Kbytes。
-p 管道缓冲区的大小,以Kbytes 为单位。例如ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。
-u 用户最大可用的进程数。例如 limit – u 65536;限制用户最多可以使用 65536个进程。
-v 进程最大可用的虚拟内存,以Kbytes 为单位。ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。
-t 最大CPU占用时间,以秒为单位。ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。
-l 最大可加锁内存大小,以Kbytes 为单位。
修改文件描述符数量限制
临时修改
如果我们需要修改 最大文件描述符的大小可以使用 ulimit -n 200000 (⚠️:这样设置仅针对当前窗口有效)
永久修改
修改系统文件 vim /etc/security/limits.conf (这样就对每一次连接都生效了)😄
详细的修改注意事项可以参考:limit资源限制ulimit 详解