性能

Get Started. It's Free
or sign up with your email address
性能 by Mind Map: 性能

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%