Create your own awesome maps

Even on the go

with our free apps for iPhone, iPad and Android

Get Started

Already have an account?
Log In

性能 by Mind Map: 性能
0.0 stars - reviews range from 0 to 5

性能

性能的目标 QPS 过载保护 超过额定处理能力,应该拒绝

客户端

cpu

执行时间=, user: opcode, 减少代码行数, vld, sys: os kernel, 减少系统调用, strace

消耗CPU的常见操作, 隐形操作, 常量/变量定义, 常量定义defined, 大数组, require "bigArray.php", 执行代码行数 = 元素个数, array(1,2,3), INIT_ARRAY ADD_ARRAY_ELEMENT ADD_ARRAY_ELEMENT, 解决方案, 按需反序列化 LazyLoad, array( '1016' => array(1016,1999,1), '1016' => '1016,1999,1' ), 拆分多个文件files, 1016.php, 1199.php, 载入环境变量 $_ENV, 一次加载, 反序列化效率极差, 不能大于1000个常量定义, 需要reload, hidef, ini, serialize, frozenarray, 载入需要reload, 定位:EMemUse%, 缓存载入(伪iowait), 隐形的unserialize操作, apc_fetch, fullcopy and unserialize, unserialize, 大数组是很耗CPU的, redis-get, memcahce->get, 解决:更高效的序列化方案, serialize:PHP, json, igbinary :PHP, config, session.serialize_handler=igbinary, apc.serializer=igbinary, $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY);, Memcached::OPT_SERIALIZER = Memcached::SERIALIZER_IGBINARY, benchmark, http://phpolyk.wordpress.com/2011/08/28/igbinary-the-new-php-serializer/, msgpack, https://github.com/msgpack/msgpack-php, redis-lua:cmsgpack, implode/explode, array_combind, 大对象, require "yiilite.php", 载入=执行, 类定义, 实例化对象, 定位:EMemUse%, 解决, LazyLoad, apc查看缓存热点文件, PHP as Server, 解决多次载入类定义的问题, 只需请求时实例化对象, 现有实现, Kellner https://github.com/fhoenig/Kellner, 把框架写成C扩展, Yar, 把PHP编译为C/C++, Facebook hiphop PHP, PHC, 算法,数值计算, 888*999, 每个php变量存在一个叫"zval"的变量容器中, 1+1在C是用两根火柴棍相加,PHP是用两根木棒, 解决:, 写c扩展, plua, v8js, 文件读取, while{fread($file, $length)}, 显性操作, preg_, str_, array_

定位:ECPU%, xhprof使用getrusage,只能记录超时1毫秒, CPU time in user space, CPU time in kernel space, php 5.5 支持用户态 systemtap

解决:, 先优化底层代码,再优化业务代码, 框架慢,一切都慢,框架耗cpu,顶层都得加上框架的cpu, action之前的,都叫框架, main()函数是cpu热点的盲区, 调试工具只会告诉你函数级的IWall%

iowait

等待IO返回

不耗PHP用户空间cpu, mysql_query, 注意:伪iowait占cpu, apc_fetch, memcache->get, redis->get

核心问题, 网络延时, 短连接, connect, 3次握手, close, 4次握手, php, 进程内单例, 进程结束被GC-close, 连接次数=请求数, 长连接, pconnect, 进程内单例模式, 由于php-frpm 进程不退出,连接不被GC-close,下次请求复用连接, pm.max_requests, MAX连接数=php-fpm客户端数量, 万一连接中断怎么办?, tcp传输机制保证, push, ack, php通过捕获异常,重新连接, 我担心连接数很大?, 对于采用epoll事件模型的服务端来说,客户端连接数多少,无所谓, 对于select/poll模型,会遍历文件描述符,影响性能, 连接池, 进程阻塞, 表现:Load高、CPU低, 耗内存:更多的php-fpm进程来hold住用户请求, 耗cpu:进程切换, PHP客户端自身还没有办法解决iowait,只能优化服务端io响应时长, 解决:单进程+IO多路复用, 同步非阻塞, cosocket, ngx_lua, gevent, php5.5, Cooperative-multitasking-using-coroutines-in-PHP http://url.cn/DVGAlw, 异步非阻塞, javascript, nodejs

定位:EWall%

服务端

快速响应才能降低上游iowait

多服务模型

多进程, apache/pre_fork

单进程+多线程, apache/mod_php

单进程+事件回调, nodejs, 回调如何识别不同请求?, 闭包保留上下文

单进程+协程, nginx_lua, 进程按每请求创建一个协程,进程内只有一个协程执行, 如何交换执行权限?, 通过IO事件, iowait立即释放, 请求结束

IO多路复用

select, while fd

poll

epoll, nginx, redis, memcache

存储设备

memory

PCI-E Flash

ssd

传输协议

传输层, 决定网络延时, unix-domain, udp, redis, memcache, tcp

应用层, 决定了, [反]序列化的CPU开销, 数据大小,决定网络延时, http, memcache, xml, soap, xmlrpc, json, igbinary, google protobuff, thrift

资源争用

不隔离?, php-fpm + redis/memcache, 几百个php-fpm进程和两个redis/memcache争用CPU,谁会赢?, redis缺乏cpu,导致长延时, php-fpm暂不支持cpu隔离:http://php-fpm.org/wiki/Wishlist, xhprof实现了调试时绑定cpu(否则cpu time不对)

隔离!, 服务器, mysql, CPU, redis/memcache匹配cpu核数, ngx_lua如何隔离, nginx, worker_cpu_affinity, woker, redis, IO, 写入/读取, 一块磁盘只有一个磁头, 空间, /var/lib, /var/log

优先级