Online Mind Mapping and Brainstorming

Create your own awesome maps

Online Mind Mapping and Brainstorming

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

优先级