Top Banner
千千千 PHP 千千千千 kim
44

PHP Optimization for Millions Visits Level

Apr 06, 2017

Download

Technology

Ho Kim
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: PHP Optimization for Millions Visits Level

千万级 PHP 接口优化kim

Page 2: PHP Optimization for Millions Visits Level

问题• 什么是千万级?• 接口扛不住,措施 1 、 2 、 3 是?• 如何优化?

Page 3: PHP Optimization for Millions Visits Level

并发数• 10000000 / 86400 ≈ 116

• 按高峰期 10 倍,即 1160req/s

Page 4: PHP Optimization for Millions Visits Level

观察• Ping • Trace• HttpWatch• Uptime• Top• Free• Nagios

Page 5: PHP Optimization for Millions Visits Level

Top 举例

Page 6: PHP Optimization for Millions Visits Level

紧急措施• 重启• 缓存穿透• 启用备机(如果有的话)

Page 7: PHP Optimization for Millions Visits Level

系统日志• Nginx access log

• Nginx error log

• PHP error log

• PHP slow log

Page 8: PHP Optimization for Millions Visits Level

访问统计• 各种访问统计• awk -F"[" '{ print $1 }'

/home/nginx/logs/access.log | sort | uniq -c | sort -rn | head -n 10

Page 9: PHP Optimization for Millions Visits Level

非 200 统计• 非 200 访问• cat /home/nginx/logs/access.log | grep -v

"\"200\""

Page 10: PHP Optimization for Millions Visits Level

日志统计系统• https://56.com/ops/index.htm

Page 11: PHP Optimization for Millions Visits Level

PHP 慢?• 有 opcode cache 的 PHP ,已经够快了!

Page 12: PHP Optimization for Millions Visits Level

真正的原因• 端口( Socket )连接慢• 端口( Socket )数据交互多

Page 13: PHP Optimization for Millions Visits Level

举例 1

• mysql_connect() • mysql_query()

• redis->connect()• redis->select()

Page 14: PHP Optimization for Millions Visits Level

举例 2

• memcache->connect()• memcache->get()

• new Mongo()• MongoCollection->find()

Page 15: PHP Optimization for Millions Visits Level

举例 3

• Http::Get()

Page 16: PHP Optimization for Millions Visits Level

如何优化 Socket

Page 17: PHP Optimization for Millions Visits Level

释放要主动• mysql_close()• Redis->close()• Memcache->close()• Mongo->close()• unset

Page 18: PHP Optimization for Millions Visits Level

验证要提前• 比如: xxx.56.com/api/someapi.php :• <?php• if (!isset($_GET['ids'])) {• die('Invalid arguments');• }• require 'index.php';

Page 19: PHP Optimization for Millions Visits Level

缓存要耦合• 评论数• 人气• 视频顶踩

Page 20: PHP Optimization for Millions Visits Level

如何优化 PHP

Page 21: PHP Optimization for Millions Visits Level

PHP 优化利器• http://pecl.php.net/package/xhprof

Page 22: PHP Optimization for Millions Visits Level

XHProf 安装• XHProf lib 包• 代码举例

Page 23: PHP Optimization for Millions Visits Level

XHProf 举例

Page 24: PHP Optimization for Millions Visits Level

代码“完美”了,还能优化吗?

Page 25: PHP Optimization for Millions Visits Level

Tcp 短连接也不能忍受了!

Page 26: PHP Optimization for Millions Visits Level

缓存优化利器• https://github.com/twitter/twemproxy

• 安装与配置

Page 27: PHP Optimization for Millions Visits Level

特性• 1. 轻量,安装配置简单• 2. 多点长连接• 3. 自动冗余• 4. 支持 memcached ascii 和 redis 协议• 5. 可监控,可记录日志

Page 28: PHP Optimization for Millions Visits Level

站内使用状况• Infov 视频信息接口• Stat 人气接口• Album 专辑信息接口

Page 29: PHP Optimization for Millions Visits Level

客户端选择• Memcached (推荐) VS Memcache

• Phpredis (推荐) VS Predis

Page 30: PHP Optimization for Millions Visits Level

反复实战• Memp 类使用举例• $mm = new Memp(array('servers' =>

array('127.0.0.1', 22122)));

Page 31: PHP Optimization for Millions Visits Level

Twemproxy 日志• -v, --verbosity=N set logging level (default: 5, min: 0, max:

11)

• 日志举例

Page 32: PHP Optimization for Millions Visits Level

Twemproxy 的问题

Page 33: PHP Optimization for Millions Visits Level

Memcache 删除不了• Bug 如下:• command_len = spprintf(&command, 0,

"delete %s %d", key, time);• command[command_len] = '\0';

• 需要人工修复:• command_len = spprintf(&command, 0,

"delete %s", key);

Page 34: PHP Optimization for Millions Visits Level

乱码与截断• 不能压缩• Memcached->setOption( Memcached::OPT_COMPRESSION,

false);

Page 35: PHP Optimization for Millions Visits Level

EOF

• Twemproxy 要求 EOL 是 “ \r\n” ,而不是 “ \n” ,所以在一些情况下是要注意,比如使用 nc 时,要带上 -C 参数,但不是每个版本的 nc 都带这个参数

• $ echo get key | nc -C 127.0.0.1 22121

Page 36: PHP Optimization for Millions Visits Level

配置要接地气• 痛苦的经历:不支持 redis->select()

Page 37: PHP Optimization for Millions Visits Level

保正一致性• hash: md5• distribution: ketama

Page 38: PHP Optimization for Millions Visits Level

缓存冗余• auto_eject_hosts: true

• 无规律• 不一致

Page 39: PHP Optimization for Millions Visits Level

如何清缓存?• 循环删除 + 队列补刀• Infov 代码举例

Page 40: PHP Optimization for Millions Visits Level

总结

Page 41: PHP Optimization for Millions Visits Level

毫秒必争• 如过你的接口平均服务时间是 30ms ,那么

1ms 的价值就是 3% 的性能提升!

Page 42: PHP Optimization for Millions Visits Level

• 提升 1ms 的途径:• 1. 把 count 移出 for 循环• 2. 把 preg_match 换成了 strstr• 3. 去掉了数组的 交集 / 并集 / 合并 操作• 4. 少创建了几个 memcache 对象

Page 43: PHP Optimization for Millions Visits Level

• 实践和测试• 加节点是最后手段

Page 44: PHP Optimization for Millions Visits Level

谢谢!