1. 客户端
1.1. cpu
1.1.1. 执行时间=
1.1.1.1. user: opcode
1.1.1.1.1. 减少代码行数
1.1.1.1.2. vld
1.1.1.2. sys: os kernel
1.1.1.2.1. 减少系统调用
1.1.1.2.2. strace
1.1.2. 消耗CPU的常见操作
1.1.2.1. 隐形操作
1.1.2.1.1. 常量/变量定义
1.1.2.1.2. 缓存载入(伪iowait)
1.1.2.1.3. 大对象
1.1.2.1.4. 算法,数值计算
1.1.2.1.5. 文件读取
1.1.2.2. 显性操作
1.1.2.2.1. preg_
1.1.2.2.2. str_
1.1.2.2.3. array_
1.1.3. 定位:ECPU%
1.1.3.1. xhprof使用getrusage,只能记录超时1毫秒
1.1.3.1.1. CPU time in user space
1.1.3.1.2. CPU time in kernel space
1.1.3.2. php 5.5 支持用户态 systemtap
1.1.4. 解决:
1.1.4.1. 先优化底层代码,再优化业务代码
1.1.4.1.1. 框架慢,一切都慢,框架耗cpu,顶层都得加上框架的cpu
1.1.4.1.2. action之前的,都叫框架
1.1.4.2. main()函数是cpu热点的盲区
1.1.4.2.1. 调试工具只会告诉你函数级的IWall%
1.2. iowait
1.2.1. 等待IO返回
1.2.2. 不耗PHP用户空间cpu
1.2.2.1. mysql_query
1.2.2.2. 注意:伪iowait占cpu
1.2.2.2.1. apc_fetch
1.2.2.2.2. memcache->get
1.2.2.2.3. redis->get
1.2.3. 核心问题
1.2.3.1. 网络延时
1.2.3.1.1. 短连接
1.2.3.1.2. 长连接
1.2.3.1.3. 连接池
1.2.3.2. 进程阻塞
1.2.3.2.1. 表现:Load高、CPU低
1.2.3.2.2. 耗内存:更多的php-fpm进程来hold住用户请求
1.2.3.2.3. 耗cpu:进程切换
1.2.3.2.4. PHP客户端自身还没有办法解决iowait,只能优化服务端io响应时长
1.2.3.2.5. 解决:单进程+IO多路复用
1.2.4. 定位:EWall%
2. 服务端
2.1. 快速响应才能降低上游iowait
2.2. 多服务模型
2.2.1. 多进程
2.2.1.1. apache/pre_fork
2.2.2. 单进程+多线程
2.2.2.1. apache/mod_php
2.2.3. 单进程+事件回调
2.2.3.1. nodejs
2.2.3.1.1. 回调如何识别不同请求?
2.2.4. 单进程+协程
2.2.4.1. nginx_lua
2.2.4.1.1. 进程按每请求创建一个协程,进程内只有一个协程执行
2.2.4.1.2. 如何交换执行权限?
2.3. IO多路复用
2.3.1. select
2.3.1.1. while fd
2.3.2. poll
2.3.3. epoll
2.3.3.1. nginx
2.3.3.2. redis
2.3.3.3. memcache
2.4. 存储设备
2.4.1. memory
2.4.2. PCI-E Flash
2.4.3. ssd
2.5. 传输协议
2.5.1. 传输层
2.5.1.1. 决定网络延时
2.5.1.2. unix-domain
2.5.1.3. udp
2.5.1.3.1. redis
2.5.1.3.2. memcache
2.5.1.4. tcp
2.5.2. 应用层
2.5.2.1. 决定了
2.5.2.1.1. [反]序列化的CPU开销
2.5.2.1.2. 数据大小,决定网络延时
2.5.2.2. http
2.5.2.3. memcache
2.5.2.4. xml
2.5.2.4.1. soap
2.5.2.4.2. xmlrpc
2.5.2.5. json
2.5.2.6. igbinary
2.5.2.7. google protobuff
2.5.2.8. thrift
2.6. 资源争用
2.6.1. 不隔离?
2.6.1.1. php-fpm + redis/memcache
2.6.1.1.1. 几百个php-fpm进程和两个redis/memcache争用CPU,谁会赢?
2.6.1.1.2. php-fpm暂不支持cpu隔离:http://php-fpm.org/wiki/Wishlist
2.6.2. 隔离!
2.6.2.1. 服务器
2.6.2.1.1. mysql
2.6.2.2. CPU
2.6.2.2.1. redis/memcache匹配cpu核数
2.6.2.2.2. ngx_lua如何隔离
2.6.2.3. IO
2.6.2.3.1. 写入/读取
2.6.2.3.2. 空间
2.6.3. 优先级