高 级服务器设计和实现 3 —— 架构、手段与工具箱

23
高高高高高高高高高高 3 —— 高高 高高高高高高 高高 ([email protected]) 2008-06-08

description

高 级服务器设计和实现 3 —— 架构、手段与工具箱. 余 锋 ([email protected]) 2008-06-08. 脚本 语言. Lua Python. 工程文件. ACE 的 mpc Gnu autoconf. 内核 应用. Tux Lvs Iptable. 内核模 块. 内核模 块 用 户空间程序 Netlink Tcpsplice. 测试工具. Tsung Loadrunner Luasocket. 收集性能数据. 纯文本 Gnuplot. 完善的日志系 统. 方便 诊断 便于 观察系统运行状态 log4X. - PowerPoint PPT Presentation

Transcript of 高 级服务器设计和实现 3 —— 架构、手段与工具箱

Page 1: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

高级服务器设计和实现 3——架构、手段与工具箱

余锋 ([email protected])2008-06-08

Page 2: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

脚本语言

• Lua• Python

Page 3: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

工程文件

• ACE 的 mpc• Gnu autoconf

Page 4: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

内核应用

• Tux • Lvs• Iptable

Page 5: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

内核模块

• 内核模块• 用户空间程序• Netlink• Tcpsplice

Page 6: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

测试工具

• Tsung• Loadrunner• Luasocket

Page 7: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

收集性能数据

• 纯文本• Gnuplot

Page 8: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

完善的日志系统

• 方便诊断• 便于观察系统运行状态• log4X

Page 9: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

常用工具

• Wireshark• Hping2• Socat• Nc• Strace• Systemtap• Lsof• webbench

Page 10: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

测试

• Xunit 单元测试• 覆盖测试• 压力测试

Page 11: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

除测试之外的手段

• 代码 Profile• 外部程序驱动

Page 12: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

硬件配置

• 多核 32 核?• 64 位机器• 大内存• 快速 IO

Page 13: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

健康监控

• SNMP• CSV • HTML• DUMP

Page 14: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

负载均衡( Load Balance )

• 基于特定服务器软件的负载均衡 • 基于 DNS 的负载均衡 • 反向代理负载均衡 • 基于 NAT 的负载均衡技术

Page 15: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

操作系统微调

• SystemTap• 协议栈微调• 内存子系统微调

Page 16: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

进程流水线

• Cgi 思路• Fastcgi 思路• 形成 pipe line• 容易整合各种语言实现的系统

Page 17: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

多路变换成单路

• Ajp13 思路• 极大简化服务端编程

Page 18: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

集群,提高可用性

• 硬件o Big IP F5o NetScaler

• 软件o Haproxyo LVS

Page 19: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

内存数据库

• Extremedb• Memcached• mnesia

Page 20: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

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 。• 避免进程 / 线程间非必要的同步,保持互斥区的短小。

Page 21: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

TIPS2

• 目前 SMP 系统和多核心 CPU比较常见,如果还是仅采用单进程(线程)的多路复用模型,那么同一时间将只有一个 CPU 为这个进程(线程)服务,并不能充分发挥 CPU 的计算能力,所以需要至少 CPU ( CPU 核心)数目个进程(线程)来分担系统负担。有一个变通的解决方案:不用修改源码,在服务器上运行两个服务程序的实例,当然这个时候服务端口应该是不同的,然后在其前端放置负载均衡器将流量和连接平均分配到两个服务端口,可以简单的通过DNAT 来实现负载均衡。其实,这个时候我们已经把多 CPU 或者是多核系统看成了多个系统组成

• 为了提高服务器的性能,单纯的依靠提高单个服务器的处理能力似乎不能奏效,况且配置越高的服务器花销也就越高,为此人们经常采用服务器集群的方式,通过把计算尽可能地分配到相对比较廉价的机器上单独完成,籍此来提升服务器的整体性能,事实证明,这种体系结构不仅是切实可行的,而且还能提高服务器的可用性,容错能力也较强。在网络服务器方面, Linux 内核中的由国人章文嵩先生设计的 IP层负载均衡解决方案 LVS比较有名,还有就是工作于应用层的 haproxy 和刚刚起步的 l7sw 。

Page 22: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

相关文档

• tuning_linux.pdf• C10k• Erlang

Page 23: 高 级服务器设计和实现 3 —— 架构、手段与工具箱

Q & A