C10K Problem 读书笔记

网页链接 http://www.kegel.com/c10k.html

这是一篇很老的文章,是2003年的创建的文章,一直修改到了2011年。但是依旧很有价值,文章中涉及的编程方式,目前依旧有用。

需要先阅读的书籍

  1. Unix Network Programming : Networking Apis: Sockets and Xti (Volume 1), Author:W. Richard Stevens,书中讲了很多I/O策略和编写高性能服务器时的陷阱。书中还讲了惊群效应(‘thundering herd’)。 可以阅读的相关网页链接 Jeff Darcy’s notes on high-performance server design http://pl.atyp.us/content/tech/servers.html

  2. 谈了一些I/O框架:ACE ASIO libevent 等。

  3. I/O策略
    1. 每个线程服务多个客户端,使用非阻塞I/O和水平触发通知(条件触发)。
    2. 每个线程服务多个客户端,使用非阻塞I/O和状态改变触发(边缘触发)。
    3. 每个线程服务多个客户端,使用异步I/O和完成通知。
    4. 每个线程服务一个客户端。相关文章:Why Events Are A Bad Idea (for High-concurrency Servers) http://www.usenix.org/events/hotos03/tech/vonbehren.html 为什么在高并发系统中事件触发不是一个好主意

将server编译到内核中执行。

将TCP协议栈放入用户空间。

注释

文件句柄数量限制

线程限制

Java 的注意事项 (Java问题)

其它注意事项

  1. Zero-Copy

  2. sendfile 能实现 Zero-Copy 网络

  3. 避免小片数据包,使用 writev 或者 TCP_CORK 选项。

  4. 一些程序能从 non-Posix threads 获利。(一些系统实现的非Posix线程)

  5. 缓存数据

其它限制

核心问题

测试服务器性能

  1. raw connections per second (how many 512 byte files per second can you serve?)
    每秒服务多少原始连接(每秒能服务/提供多少个512字节的文件)

  2. total transfer rate on large files with many slow clients (how many 28.8k modem clients can simultaneously download from your server before performance goes to pot?)
    服务多个慢速客户端传输大文件时的总传输速率(有多少28.8k modem的慢速客户端从你的服务器下载时,你的服务器会达到瓶颈)。