性能

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

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. 优先级