230 likes | 447 Views
高 级服务器设计和实现 3 —— 架构、手段与工具箱. 余 锋 (mryufeng@gmail.com) 2008-06-08. 脚本 语言. Lua Python. 工程文件. ACE 的 mpc Gnu autoconf. 内核 应用. Tux Lvs Iptable. 内核模 块. 内核模 块 用 户空间程序 Netlink Tcpsplice. 测试工具. Tsung Loadrunner Luasocket. 收集性能数据. 纯文本 Gnuplot. 完善的日志系 统. 方便 诊断 便于 观察系统运行状态 log4X.
E N D
高级服务器设计和实现3——架构、手段与工具箱高级服务器设计和实现3——架构、手段与工具箱 余锋 (mryufeng@gmail.com) 2008-06-08
脚本语言 Lua Python
工程文件 ACE 的mpc Gnu autoconf
内核应用 Tux Lvs Iptable
内核模块 内核模块 用户空间程序 Netlink Tcpsplice
测试工具 Tsung Loadrunner Luasocket
收集性能数据 纯文本 Gnuplot
完善的日志系统 方便诊断 便于观察系统运行状态 log4X
常用工具 Wireshark Hping2 Socat Nc Strace Systemtap Lsof webbench
测试 Xunit单元测试 覆盖测试 压力测试
除测试之外的手段 代码Profile 外部程序驱动
硬件配置 多核 32核? 64位机器 大内存 快速IO
健康监控 SNMP CSV HTML DUMP
负载均衡(Load Balance) 基于特定服务器软件的负载均衡 基于DNS的负载均衡 反向代理负载均衡 基于NAT的负载均衡技术
操作系统微调 SystemTap 协议栈微调 内存子系统微调
进程流水线 Cgi思路 Fastcgi思路 形成pipe line 容易整合各种语言实现的系统
多路变换成单路 Ajp13思路 极大简化服务端编程
集群,提高可用性 硬件 Big IP F5 NetScaler 软件 Haproxy LVS
内存数据库 Extremedb Memcached mnesia
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。 避免进程/线程间非必要的同步,保持互斥区的短小。
TIPS2 目前SMP系统和多核心CPU比较常见,如果还是仅采用单进程(线程)的多路复用模型,那么同一时间将只有一个CPU为这个进程(线程)服务,并不能充分发挥CPU的计算能力,所以需要至少CPU(CPU核心)数目个进程(线程)来分担系统负担。有一个变通的解决方案:不用修改源码,在服务器上运行两个服务程序的实例,当然这个时候服务端口应该是不同的,然后在其前端放置负载均衡器将流量和连接平均分配到两个服务端口,可以简单的通过DNAT来实现负载均衡。其实,这个时候我们已经把多CPU或者是多核系统看成了多个系统组成 为了提高服务器的性能,单纯的依靠提高单个服务器的处理能力似乎不能奏效,况且配置越高的服务器花销也就越高,为此人们经常采用服务器集群的方式,通过把计算尽可能地分配到相对比较廉价的机器上单独完成,籍此来提升服务器的整体性能,事实证明,这种体系结构不仅是切实可行的,而且还能提高服务器的可用性,容错能力也较强。在网络服务器方面,Linux内核中的由国人章文嵩先生设计的IP层负载均衡解决方案LVS比较有名,还有就是工作于应用层的haproxy和刚刚起步的l7sw。
相关文档 tuning_linux.pdf C10k Erlang