高性能服务器编程目录

By | 2016-12-14
一基本方法篇
high-performance server architecture–Jeff Darcy  [http://pl.atyp.us/content/tech/servers.html ]
总结分析了影响服务器性能的四大杀手:
  • 数据拷贝(Data Copies);
  • 环境切换(Context Switches);
  • 内存分配(Memory allocation);
  •  锁竞争(Lock contention)。
1网络模型
  •  阻塞/非阻塞;
  •  同步/异步;
  •  IO 复用;
  •  长连接/短连接
1.1 The C10K problem
总结了并发上万连接的常用高性能IO 策略:
  • 一个线程服务多个客户端,使用非阻塞I/O 和水平触发的就绪通知;
  •  一个线程服务多个客户端,使用非阻塞I/O 和就绪改变时通知;
  •  一个服务线程服务多个客户端,使用异步I/O;
  •  一个服务线程服务一个客户端,使用阻塞I/O;
 把服务代码编译进内核。
知识点:
  •  select/ poll/ kqueue;
  •  epoll:水平出发vs 边缘触发
  •  完成端口IOCP
  •  NPTL;
  •  Zero-copy;
  •  sendfile;
  •  writev/readv。
1.2异步IO
  •  Linux epoll–异步阻塞
  •  Linux aio–异步非阻塞
  •  Windows iocp–异步非阻塞
  •  Boost asio
1.3 Topics in High-PerformanceMessaging
讨论了TCP 延时和UDP 缓冲,以及流量控制的一些话题:
  •  TCP Latency
  •  UDP Buffer
  •  Multicast
2多线程多进程
2.1常用服务器模型:
  • 单进程(线程)迭代
  •  父进程+动态fork 子进程(线程)
  •  预创建进程(线程)池
  •  父进程+预创建进程(线程)池
  •  单进程IO 复用
  •  单进程接入+处理子进程(线程)池
 单进程接入+少数处理进程(线程)
2.2 NPTL
阐述了linux 多线程库NPTL 的设计:
  • 1 on 1 vs M on N
  •  No manager thread
2.3多线程模型
线程特定存储-Google 的内存分配器TCMalloc
2.4 CPU亲和力
多核体系问题:线程间切换开销;多核体系处理器cache 的”乒乓效应”。
CPU 亲和力指
在多核体系中进程(线程)能够单独绑定到一个处理核的能力。使用硬亲合力的场景有:
  • 有大量计算要做
  • 复杂的应用程序
  • 时间敏感的、决定性的进程
3锁相关技术
  • 进程锁vs 线程锁
  •  加锁的粒度:库级锁/表级锁/页级锁/行级锁
  •  各种锁系统开销:互斥锁/读写锁/意向锁/自旋锁
  •  分布式加锁算法
  •  锁表的实现
  •  Lock free
  •  免锁模型:环形缓冲区
4内存磁盘存储模型
4.1 减少数据拷贝
4.2 池式技术
  •  Memory pool
  •  Object pool
4.3 读写技术
  • Prefetch
  • Delay write
  • Copy OnWrite
  • 空间换时间
  • 双缓冲技术
5通信协议
5.1 Google protocol buffer
  •  序列化和反序列化
  •  一种描述数据格式的IDL,生成了更容易在编程中使用的数据访问类
  •  对IDL 所描述的格式进行编码的一种二进制编码方案
  • 通过代码生成器实现的数据绑定支持,Google 提供了C++、Python、Java 实现
  •  与XML 相比,Protocol Buffers 文件的尺寸要小3-10倍,解析速度要快20-100倍.
5.3 ICE/Corba等IDL
6有状态服务/无状态服务器
有状态服务器:
  • 服务器中保存少量信息可以减少客户和服务器之间交换报文的大小,快速响应请求。
  • 应用协议规定某个报文取决于先前的报文
  • 维护状态机,实现复杂
无状态服务器:
  • 报文既不能依赖是否被按序交付,也不能依赖先前已经被交付的报文
  • 实现简单高效
二典型网络模式
  •  Reactor-同步
  •  Proactor-异步
  •  半同步半异步
  •  领导者/追随者
  • A Design Framework for Highly Concurrent Systems: 在tasks, queues, thread pools 等设计元素的基础上提出了常用的高并发系统设计模式。
三系统实现篇
4
1 libevent
libevent 是一个事件触发的网络库,适用于windows、linux、bsd 等多种平台,内部使用
select、epoll、kqueue 等系统调用管理事件机制。典型Reactor 模式。
2 spserver
spserver 是一个实现了半同步/ 半异步(Half-Sync/Half-Async) 和领导者/ 追随者
(Leader/Follower) 模式的服务器框架,网络模块采用libevent。
3 memcached网络模块
高效率的key-value 内存存储系统,网络模块采用libevent 实现。
4ACE
重量级的网络IO 框架,学院派的ACE 总结的网络模型常用设计模式值得研究和学习。
5 Flash:AnEfficient and PortableWeb Server