高并发服务器开发与配置


高并发服务器开发与配置

文章插图
 
一、4大具有代表性的并发模型及其优缺点
4大具有代表性的并发模型:Apache模型(Process Per Connection , 简称PPC) , TPC(Thread PerConnection)模型 , select模型和poll模型、Epoll模型 。
Apache(PPC)模型和TPC模型是最容易理解的 , Apache模型在并发上是通过多进程实现的 , 而TPC模型是通过多线程实现的 , 但是这2种方式在大量进程/线程切换时会造成大量的开销 。
select模型是通过一种轮询机制来实现的 。需要注意select模型有3大不足:
a.Socket文件数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.
b.操作限制:通过遍历FD_SETSIZE(1024)个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍,这样效率就会随文件数量的增多呈现线性下降,把FD_SETSIZE改大的后果就是遍历需要更久的时间 。管理文件数量和管理效率成反比 。
c.内存复制限制:内核/用户空间的信息交换是通过内存拷贝来完成的 , 这样在高并发情况下就会存在大量的数据拷贝 , 浪费时间 。
poll模型与select类似 , 也是通过轮询来实现 , 但它与select模型的区别在于Socket数量没有限制 , 所以poll模型有2大不足:操作限制和内存复制限制 。
Epoll模型改进了poll和sellect模型 。Epoll没有文件数量限制 , 上限是当前用户单个进程最大能打开的文件数;使用事件驱动 , 不使用轮询 , 而使用基于内核提供的反射模式 。有“活跃Socket”时,内核访问该Socket的callback , 直接返回产生事件的文件句柄;内核/用户空间信息交换通过共享内存mmap实现 , 避免了数据复制 。
目前市场用得比较多的就是Apache、Nginx、Lighttpd. Apache的占有率是最高是毋庸置疑的,但它主要是采用select模式开发 。当前主流的异步web服务器Lighttpd和Nginx都是基于Epoll的 。它们具有非常好的架构 , 可以运行在简单的web集群中 。但在数据结构、内存管理都多个细节方面处理nginx考虑更加完善 。nginx从event、跨平台、基础数据结构都很多细节方面进行了考虑和优化 。nginx必定是未来的apache , 未来的主流 。
二、主机环境对高并发应用程序的天然限制
高并发的应用程序至少需要考虑3大限制条件:用户进程的默认内存空间为4G , 线程栈默认为8M , 用户进程最大能管理的文件描述符默认为1024个 , 网卡对客户端端口号数量的限制 。
linux下高并发socket服务器端和客户端最大连接数所受的限制问题(修改软限制和硬限制)
1、配置用户进程可打开的最多文件数量的限制
在Linux平台上 , 无论编写客户端程序还是服务端程序 , 在进行高并发TCP连接处理时 , 最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄 , 每个socket句柄同时也是一个文件句柄) 。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:[speng@as4 ~]$ ulimit -n1024 #系统默认对某一个用户打开文件数的用户软限制是1024 , 用户硬限制是4096个
这表示当前用户的每个进程最多允许同时打开1024个文件 , 这1024个文件中还得除去每个进程必然打开的标准输入 , 标准输出 , 标准错误 , 服务器监听 socket,进程间通讯的unix域socket等文件 , 那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右 。也就是说缺省情况下 , 基于Linux的通讯程序最多允许同时1014个TCP并发连接 。
如果想支持更高数量的TCP并发连接的通讯处理程序 , 就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit) 。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时能打开的文件数;硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量 。通常软限制小于或等于硬限制 。修改上述限制的最简单的办法就是使用ulimit命令:[speng@as4 ~]$ ulimit -n 100 #(只能设置比当前soft限制更小的数)上述命令中 , 指定要设置的单一进程允许打开的最大文件数 。如果系统回显类似于"Operation notpermitted"之类的话 , 说明上述限制修改失败 , 实际上是因为在此指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制 。因此 , 就需要修改Linux系统对用户的关于打开文件数的软限制和硬限制 。如果需要设置比当前软限制和硬限制更大的数 , 只能修改配置文件 , 步骤如下:


推荐阅读