解决C10K 问题操作系统 内容配置 详解

470 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

什么是 C10K 问题?

引用一位掘友的文章可以看下,服务端经典的C10k问题(译)

大概描述一下就是,在很多年以前计算机性能还不是很高的时候,随着互联网的发展,一些网站应用用户越来越多,随之而来的也带来了一些瓶颈的问题,就比如说一台服务器怎么同时维持1W的在线用户,同时为1W个客户端同时提供服务,也就是我们所说的C10K(1W client)问题,当然这个问题在现在可能不值得一提,但是当时的一些思想和问题的解决方法,还是值得我们现在去学习和思考的。


为什么我们需要修改操作系统的一些限制?

如果我们不管操作系统的一些东西,我们能维持多少 socket 连接呢?

在这里我做了一个实验

image.png

可以看到连接最多在1000 左右,再多就是too many open files , 为什么会是这样呢?

为什么会出现文件描述符过多的错误呢?

Linux中Too many open files 问题分析和解决

搜索了一下,发现是操作系统对每个程序打开的文件描述符 数量有所限制。

这些限制从哪里看呢?

ulimit -a

image.png

这些都是什么意思呢?

-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 详解