More Related Content
Similar to 高级服务器设计和实现3 (20)
高级服务器设计和实现3
- 20. TIPS1
• 操作系统采用 Linux 2.6.x 内核,不仅因为它的高性能,更因为它大开源(这并不是说
其他的 UNIX 或者是 BSD 衍生物不开源)给程序设计带来的便利,我们甚至可以把服
务做到内核空间。
• 多路复用采用 epoll 的“电平触发” (Level Triggered) 模式,必要时可以采用“边缘
触发” (Edge Triggered) ,但要注意防止数据停滞。
• 为避免数据拷贝可以采用 sendfile 系统调用发送小文件,或者是文件的小部分,注意避
免 sendfile 因磁盘 IO 而导致的阻塞。
• 如果服务操作设计大量磁盘 IO 操作,应选用 Linux 内核提供的异步 IO 机制,其对应的
用户空间库为 libaio ,注意:这里提到异步 IO 库并非目前 glibc 中附带的异步 IO 实现。
• 如果同时有多个数据需要传输,采用 writev/readv 来减少系统调用所带来的上下文切
换开销,如果数据要写到网络套接字文件描述符,这也能在一定程度上防止网络上出现
比较小帧,为此,还可以有选择地开启 TCP_CORK 选项。
• 实现自己的内存管理,比如说缓存数据,复用常用数据结构等。
• 用多线程替代多进程,线程库当然选择 nptl 。
• 避免进程 / 线程间非必要的同步,保持互斥区的短小。
- 21. TIPS2
• 目前 SMP 系统和多核心 CPU 比较常见,如果还是仅采用单进程(线程)的多
路复用模型,那么同一时间将只有一个 CPU 为这个进程(线程)服务,并不能
充分发挥 CPU 的计算能力,所以需要至少 CPU ( CPU 核心)数目个进程(线
程)来分担系统负担。有一个变通的解决方案:不用修改源码,在服务器上运
行两个服务程序的实例,当然这个时候服务端口应该是不同的,然后在其前端
放置负载均衡器将流量和连接平均分配到两个服务端口,可以简单的通过
DNAT 来实现负载均衡。其实,这个时候我们已经把多 CPU 或者是多核系统看
成了多个系统组成
• 为了提高服务器的性能,单纯的依靠提高单个服务器的处理能力似乎不能奏效
,况且配置越高的服务器花销也就越高,为此人们经常采用服务器集群的方式
,通过把计算尽可能地分配到相对比较廉价的机器上单独完成,籍此来提升服
务器的整体性能,事实证明,这种体系结构不仅是切实可行的,而且还能提高
服务器的可用性,容错能力也较强。在网络服务器方面, Linux 内核中的由国
人章文嵩先生设计的 IP 层负载均衡解决方案 LVS 比较有名,还有就是工作于
应用层的 haproxy 和刚刚起步的 l7sw 。