高级服务器设计和实现3

1,963 views

Published on

Published in: Technology, News & Politics
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,963
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
107
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

高级服务器设计和实现3

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

×