
1. 服务端
1.1. 快速响应才能降低上游iowait
1.2. 多服务模型
1.2.1. 多进程
1.2.1.1. apache/pre_fork
1.2.2. 单进程+多线程
1.2.2.1. apache/mod_php
1.2.3. 单进程+事件回调
1.2.3.1. nodejs
1.2.3.1.1. 回调如何识别不同请求?
1.2.4. 单进程+协程
1.2.4.1. nginx_lua
1.2.4.1.1. 进程按每请求创建一个协程,进程内只有一个协程执行
1.2.4.1.2. 如何交换执行权限?
1.3. IO多路复用
1.3.1. select
1.3.1.1. while fd
1.3.2. poll
1.3.3. epoll
1.3.3.1. nginx
1.3.3.2. redis
1.3.3.3. memcache
1.4. 存储设备
1.4.1. memory
1.4.2. PCI-E Flash
1.4.3. ssd
1.5. 传输协议
1.5.1. 传输层
1.5.1.1. 决定网络延时
1.5.1.2. unix-domain
1.5.1.3. udp
1.5.1.3.1. redis
1.5.1.3.2. memcache
1.5.1.4. tcp
1.5.2. 应用层
1.5.2.1. 决定了
1.5.2.1.1. [反]序列化的CPU开销
1.5.2.1.2. 数据大小,决定网络延时
1.5.2.2. http
1.5.2.3. memcache
1.5.2.4. xml
1.5.2.4.1. soap
1.5.2.4.2. xmlrpc
1.5.2.5. json
1.5.2.6. igbinary
1.5.2.7. google protobuff
1.5.2.8. thrift
1.6. 资源争用
1.6.1. 不隔离?
1.6.1.1. php-fpm + redis/memcache
1.6.1.1.1. 几百个php-fpm进程和两个redis/memcache争用CPU,谁会赢?
1.6.1.1.2. php-fpm暂不支持cpu隔离:http://php-fpm.org/wiki/Wishlist
1.6.2. 隔离!
1.6.2.1. 服务器
1.6.2.1.1. mysql
1.6.2.2. CPU
1.6.2.2.1. redis/memcache匹配cpu核数
1.6.2.2.2. ngx_lua如何隔离
1.6.2.3. IO
1.6.2.3.1. 写入/读取
1.6.2.3.2. 空间
1.6.3. 优先级
2. 客户端
2.1. cpu
2.1.1. 执行时间=
2.1.1.1. user: opcode
2.1.1.1.1. 减少代码行数
2.1.1.1.2. vld
2.1.1.2. sys: os kernel
2.1.1.2.1. 减少系统调用
2.1.1.2.2. strace
2.1.2. 消耗CPU的常见操作
2.1.2.1. 隐形操作
2.1.2.1.1. 常量/变量定义
2.1.2.1.2. 缓存载入(伪iowait)
2.1.2.1.3. 大对象
2.1.2.1.4. 算法,数值计算
2.1.2.1.5. 文件读取
2.1.2.2. 显性操作
2.1.2.2.1. preg_
2.1.2.2.2. str_
2.1.2.2.3. array_
2.1.3. 定位:ECPU%
2.1.3.1. xhprof使用getrusage,只能记录超时1毫秒
2.1.3.1.1. CPU time in user space
2.1.3.1.2. CPU time in kernel space
2.1.3.2. php 5.5 支持用户态 systemtap
2.1.4. 解决:
2.1.4.1. 先优化底层代码,再优化业务代码
2.1.4.1.1. 框架慢,一切都慢,框架耗cpu,顶层都得加上框架的cpu
2.1.4.1.2. action之前的,都叫框架
2.1.4.2. main()函数是cpu热点的盲区
2.1.4.2.1. 调试工具只会告诉你函数级的IWall%
2.2. iowait
2.2.1. 等待IO返回
2.2.2. 不耗PHP用户空间cpu
2.2.2.1. mysql_query
2.2.2.2. 注意:伪iowait占cpu
2.2.2.2.1. apc_fetch
2.2.2.2.2. memcache->get
2.2.2.2.3. redis->get
2.2.3. 核心问题
2.2.3.1. 网络延时
2.2.3.1.1. 短连接
2.2.3.1.2. 长连接
2.2.3.1.3. 连接池
2.2.3.2. 进程阻塞
2.2.3.2.1. 表现:Load高、CPU低
2.2.3.2.2. 耗内存:更多的php-fpm进程来hold住用户请求
2.2.3.2.3. 耗cpu:进程切换
2.2.3.2.4. PHP客户端自身还没有办法解决iowait,只能优化服务端io响应时长
2.2.3.2.5. 解决:单进程+IO多路复用
2.2.4. 定位:EWall%