C10K Problem 读书笔记
网页链接 http://www.kegel.com/c10k.html
这是一篇很老的文章,是2003年的创建的文章,一直修改到了2011年。但是依旧很有价值,文章中涉及的编程方式,目前依旧有用。
需要先阅读的书籍
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 。
谈了一些I/O框架:ACE ASIO libevent 等。
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问题)
其它注意事项
Zero-Copy
sendfile 能实现 Zero-Copy 网络
避免小片数据包,使用 writev 或者 TCP_CORK 选项。
一些程序能从 non-Posix threads 获利。(一些系统实现的非Posix线程)
缓存数据
其它限制
核心问题
测试服务器性能
raw connections per second (how many 512 byte files per second can you serve?)
每秒服务多少原始连接(每秒能服务/提供多少个512字节的文件)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的慢速客户端从你的服务器下载时,你的服务器会达到瓶颈)。