【笔记】高性能服务器设计

阅读原文: High Performance Server Architecture

数据拷贝(data copies)

有些数据拷贝隐藏的很深, 经常被忽略. 避免数据拷贝, 最有效的方法是用间接引用, 例如使用指针或者 buffer 的下标.

上下文切换(context switches)

上下文切换的消耗比较大, 这也是为什么网络 server 不推荐每个连接单独开个线程的 IO 策略的原因.

一般active线程的数量要 <= CPU 核数 * 2.

主线程监听网络, worker 线程分发处理, 这种模型会比较常见且高效.

使用一种"平滑"的方法来避免上下文切换非常重要.

内存分配(memory allocator)

减少向 OS 申请内存, 有一些比较好的方式, 例如预分配, freelist 回收复用等.

锁竞争(lock contention)

粒度太粗会导致处理串行化, 浪费了多核的优势.

粒度太细代码难控制, 容易死锁.

尽量做无锁的设计, GCC 的 sync 函数组可以比较高效的实现自旋锁.

其他

存储系统的读写效率.

网络协议的性能, 例如 TCP 的 kernel 参数.

CPU 的 cache 命中.

events 有没有"惊群"效应.

等等.