php使用CodeIgniter使用thrift的cpu使用率居高不下

路飞 发布于 2016/03/07 18:57
阅读 1K+
收藏 1

最近在用php和thrift做个小东西,然后框架沿用之前的老系统,使用的是CodeIgniter,不过升级到了3.0.3。

php负责在前端接收http请求,然后通过thrift调用后端的Java做的服务接口。

在做第一轮压力测试的时候发现,php或者说CI的吞吐能力有点离谱。

测试环境服务器配置如下

cpu:Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz × 4

内存:2G

OS:Debian GNU/Linux 6.0.5

php-fpm进程数:4

php的应用和java的应用部署在不同的服务器上

php所在服务器的性能表现如下

并发     tps mrt cpu 内存
50 184 0.24 78% 100M
100 181 0.54 75% 110M
150 184 0.79 75% 110M
200 183 1.06 80% 120M
300 165 1.76 81% 130M

于此同时,java所在服务器的各资源使用情况很正常,cpu使用率不到20%,内存使用不到200M。

然后进一步测试,把php中关于thrift调用服务端的功能暂时去掉,即只保留php接收http请求然后直接返回一个mock的结果。

结果测试结果并不比上次全流程的好多少,除了tps和mrt有了些许(不到10%)提升,cpu使用率并没有任何好转,一直持续在80%左右。

通过strace命令记录了下其中一个php-fpm进程的系统调用情况,短短3-4秒的时间记录文件就达到了500多KB,大概扫一眼,系统一直在调用CI框架里的各种基础文件(虽然每个单独的调用耗时都很少),偶尔才会有一条调用具体业务的记录

片段如下

09:47:44.281516 lstat("/home/project/webroot_dev/application/core/MY_Router.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000009>
09:47:44.281591 access("/home/project/webroot_dev/application/config/routes.php", F_OK) = 0 <0.000011>
09:47:44.281644 open("/home/project/webroot_dev/application/config/routes.php", O_RDONLY) = 4 <0.000010>
09:47:44.281685 fstat(4, {st_mode=S_IFREG|0644, st_size=1969, ...}) = 0 <0.000006>
09:47:44.281726 fstat(4, {st_mode=S_IFREG|0644, st_size=1969, ...}) = 0 <0.000006>
09:47:44.281763 fstat(4, {st_mode=S_IFREG|0644, st_size=1969, ...}) = 0 <0.000005>
09:47:44.281800 mmap(NULL, 1969, PROT_READ, MAP_SHARED, 4, 0) = 0x7f05e4cfe000 <0.000010>
09:47:44.281877 munmap(0x7f05e4cfe000, 1969) = 0 <0.000010>
09:47:44.281916 close(4)                = 0 <0.000007>
09:47:44.281960 lstat("/home/project/webroot_dev/application/config/production/routes.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000009>
09:47:44.282040 access("/home/project/webroot_dev/application/controllers/Redeem.php", F_OK) = 0 <0.000010>
09:47:44.282114 lstat("/home/project/webroot_dev/application/core/Output.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000011>
09:47:44.282175 access("/home/project/webroot_dev/system/core/Output.php", F_OK) = 0 <0.000013>
09:47:44.282239 open("/home/project/webroot_dev/system/core/Output.php", O_RDONLY) = 4 <0.000010>
09:47:44.282280 fstat(4, {st_mode=S_IFREG|0644, st_size=20029, ...}) = 0 <0.000008>
09:47:44.282338 fstat(4, {st_mode=S_IFREG|0644, st_size=20029, ...}) = 0 <0.000006>
09:47:44.282377 fstat(4, {st_mode=S_IFREG|0644, st_size=20029, ...}) = 0 <0.000006>
09:47:44.282425 mmap(NULL, 20029, PROT_READ, MAP_SHARED, 4, 0) = 0x7f05e4cfa000 <0.000008>
09:47:44.283347 munmap(0x7f05e4cfa000, 20029) = 0 <0.000012>
09:47:44.283392 close(4)                = 0 <0.000007>
09:47:44.283440 lstat("/home/project/webroot_dev/application/core/MY_Output.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000009>
09:47:44.283506 lstat("/home/project/webroot_dev/application/config/production/mimes.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000009>
09:47:44.283555 access("/home/project/webroot_dev/application/config/mimes.php", F_OK) = 0 <0.000010>
09:47:44.283602 open("/home/project/webroot_dev/application/config/mimes.php", O_RDONLY) = 4 <0.000010>
09:47:44.283641 fstat(4, {st_mode=S_IFREG|0644, st_size=8447, ...}) = 0 <0.000006>
09:47:44.283681 fstat(4, {st_mode=S_IFREG|0644, st_size=8447, ...}) = 0 <0.000006>
09:47:44.283718 fstat(4, {st_mode=S_IFREG|0644, st_size=8447, ...}) = 0 <0.000006>
09:47:44.283754 mmap(NULL, 8447, PROT_READ, MAP_SHARED, 4, 0) = 0x7f05e4cfc000 <0.000007>
09:47:44.284073 munmap(0x7f05e4cfc000, 8447) = 0 <0.000011>
09:47:44.284116 close(4)                = 0 <0.000007>
09:47:44.284303 lstat("/home/project/webroot_dev/application/cache/abe45481e6b6b3b554f78734cbb4b8d6", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000009>
09:47:44.284364 lstat("/home/project/webroot_dev/application/core/Security.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000009>
09:47:44.284411 access("/home/project/webroot_dev/system/core/Security.php", F_OK) = 0 <0.000009>
09:47:44.284459 open("/home/project/webroot_dev/system/core/Security.php", O_RDONLY) = 4 <0.000010>
09:47:44.284499 fstat(4, {st_mode=S_IFREG|0644, st_size=27465, ...}) = 0 <0.000006>
09:47:44.284539 fstat(4, {st_mode=S_IFREG|0644, st_size=27465, ...}) = 0 <0.000006>
09:47:44.284575 fstat(4, {st_mode=S_IFREG|0644, st_size=27465, ...}) = 0 <0.000006>
09:47:44.284612 mmap(NULL, 27465, PROT_READ, MAP_SHARED, 4, 0) = 0x7f05e4cf8000 <0.000008>
09:47:44.284980 brk(0x1499000)          = 0x1499000 <0.000008>
09:47:44.285697 munmap(0x7f05e4cf8000, 27465) = 0 <0.000012>
09:47:44.285743 close(4)                = 0 <0.000007>
09:47:44.285791 lstat("/home/project/webroot_dev/application/core/MY_Security.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000010>
09:47:44.285876 lstat("/home/project/webroot_dev/application/core/Input.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000009>
09:47:44.285927 access("/home/project/webroot_dev/system/core/Input.php", F_OK) = 0 <0.000009>
09:47:44.285975 open("/home/project/webroot_dev/system/core/Input.php", O_RDONLY) = 4 <0.000009>
09:47:44.286015 fstat(4, {st_mode=S_IFREG|0644, st_size=22504, ...}) = 0 <0.000006>
09:47:44.286055 fstat(4, {st_mode=S_IFREG|0644, st_size=22504, ...}) = 0 <0.000005>
09:47:44.286092 fstat(4, {st_mode=S_IFREG|0644, st_size=22504, ...}) = 0 <0.000006>
09:47:44.286129 mmap(NULL, 22504, PROT_READ, MAP_SHARED, 4, 0) = 0x7f05e4cf9000 <0.000008>
09:47:44.287110 munmap(0x7f05e4cf9000, 22504) = 0 <0.000012>
09:47:44.287166 close(4)                = 0 <0.000007>
09:47:44.287214 lstat("/home/project/webroot_dev/application/core/MY_Input.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000009>
09:47:44.287370 lstat("/home/project/webroot_dev/application/core/Lang.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000016>
09:47:44.287438 access("/home/project/webroot_dev/system/core/Lang.php", F_OK) = 0 <0.000009>
09:47:44.287489 open("/home/project/webroot_dev/system/core/Lang.php", O_RDONLY) = 4 <0.000010>
09:47:44.287529 fstat(4, {st_mode=S_IFREG|0644, st_size=5462, ...}) = 0 <0.000005>
09:47:44.287570 fstat(4, {st_mode=S_IFREG|0644, st_size=5462, ...}) = 0 <0.000006>
09:47:44.287607 fstat(4, {st_mode=S_IFREG|0644, st_size=5462, ...}) = 0 <0.000005>
09:47:44.287644 mmap(NULL, 5462, PROT_READ, MAP_SHARED, 4, 0) = 0x7f05e4cfd000 <0.000008>
09:47:44.287913 munmap(0x7f05e4cfd000, 5462) = 0 <0.000011>
09:47:44.287956 close(4)                = 0 <0.000007>
09:47:44.288004 lstat("/home/project/webroot_dev/application/core/MY_Lang.php", 0x7fff81ed94b0) = -1 ENOENT (No such file or directory) <0.000009>
09:47:44.288070 open("/home/project/webroot_dev/system/core/Controller.php", O_RDONLY) = 4 <0.000010>
09:47:44.288113 fstat(4, {st_mode=S_IFREG|0644, st_size=2896, ...}) = 0 <0.000006>
09:47:44.288153 fstat(4, {st_mode=S_IFREG|0644, st_size=2896, ...}) = 0 <0.000005>
09:47:44.288189 fstat(4, {st_mode=S_IFREG|0644, st_size=2896, ...}) = 0 <0.000006>
09:47:44.288226 mmap(NULL, 2896, PROT_READ, MAP_SHARED, 4, 0) = 0x7f05e4cfe000 <0.000007>
09:47:44.288344 munmap(0x7f05e4cfe000, 2896) = 0 <0.000010>
09:47:44.288385 close(4)                = 0 <0.000007>
09:47:44.288429 access("/home/project/webroot_dev/application/core/MY_Controller.php", F_OK) = 0 <0.000017>
09:47:44.288495 open("/home/project/webroot_dev/application/core/MY_Controller.php", O_RDONLY) = 4 <0.000011>
09:47:44.288540 fstat(4, {st_mode=S_IFREG|0644, st_size=2713, ...}) = 0 <0.000005>
09:47:44.288583 fstat(4, {st_mode=S_IFREG|0644, st_size=2713, ...}) = 0 <0.000006>
09:47:44.288621 fstat(4, {st_mode=S_IFREG|0644, st_size=2713, ...}) = 0 <0.000005>
09:47:44.288667 mmap(NULL, 2713, PROT_READ, MAP_SHARED, 4, 0) = 0x7f05e4cfe000 <0.000008>
09:47:44.288854 munmap(0x7f05e4cfe000, 2713) = 0 <0.000011>
09:47:44.288896 close(4)                = 0 <0.000007>
09:47:44.288948 access("/home/project/webroot_dev/application/controllers/Redeem.php", F_OK) = 0 <0.000010>



现在还处于对php特性的摸索阶段,暂时没有什么调优的思路,CI不是据说很简洁么,怎么系统调用里这么多的不相干的东西。。。

各位有什么思路可以推荐下嘛~



按照惯例,福利奉上






加载中
0
eechen
eechen
E5-2650 v2 是8核心16线程,你才开4个PHP-FPM工作进程呀,还有你观测过PHP-FPM的CPU使用率了么?你可以先开一个PHP-FPM工作进程来测试,用pidstat -p PID 1来观测单个PHP-FPM进程的CPU使用情况,再对比系统CPU使用情况,看看瓶颈出在哪里.

我普通笔记本i5-3230M(双核四线程)用ab并发100压测WordPress首页,ab/Nginx/PHP/MySQL都跑在同一台机器上,PHP7驱动下每秒都能处理约120个请求,跟HHVM一个水平.

框架对PHP来说的确是很耗性能的,需要提升性能可以上PHP7,并且开启opcache代码缓存,甚至可以试试opcache.file_cache预编译.
路飞
路飞
额有点忙,下午再细研究下,另外cpu那个是我写错了,E5-2650 v2是物理机的,我们的服务器是虚拟机,分配给了相当于4个线程的资源,然后尝试的过程中发现4个php-fpm进程的性能表现要比更多的进程数要好
0
南湖船老大
南湖船老大
楼主看来不了解PHP,PHP是每次运行都要重新解析所有文件的,所以用了框架性能影响比较大。

opcache就是干缓存这个事的。PHP里用了缓存和不用缓存,差异是很大的。
eechen
eechen
回复 @犯贱智障人士专职医生 : 否定框架不意味着否定OOP,OOP给PHP带来的性能开销跟PHP实现的框架比起来,微不足道,还不至于引起质变.
行业协汇袁斌
行业协汇袁斌
回复 @eechen : 算了不想说了, 你举得例子要么就是很早以前php没有面对对象特性的时代的东西, 要么就是论坛一类的小项目不需要面对对象支持的业务。这些不仅仅是php不需要框架就能完成其他语言也一样可以。。。你可能没见过太复杂的业务场景需要框架加速和规范的。其实不用说别的, 就说php一直在学习java走OOP的道路就是为了框架化规模开发准备的,不然要OOP这种只能损失性能的玩意儿干嘛?
eechen
eechen
回复 @犯贱智障人士专职医生 : WordPress用框架了么?Discuz用框架了么?PunBB用框架了么?说个近点的,爱码士社区:一款基于PHP+NoSQL(SSDB)的开源论坛,不用第三方框架,前端只用jQuery,编辑器就一个textarea,私信用定时轮询.还有一个国人写的新的论坛Carbon Forum,也没有用框架: https://www.94cb.com/ 你怎么看?
行业协汇袁斌
行业协汇袁斌
回复 @eechen : 要不说你真2,能正常说话吗?不为了开发效率谁会用php?用php的人有几个不适用框架加速开发的?尤其是像样点的项目谁不用框架(哪怕自己写的),你说的那个速度快是C的功劳这正好暴露了你喜欢自己打自己脸的爱好。。。一会吹嘘php速度快php7如何神奇一会又说php框架慢这脸打的。 可怜啊, 赶紧治病去吧别耽误了得了php癌就没救了。
eechen
eechen
回复 @犯贱智障人士专职医生 : 为什么Hello测试中,PHP用于开发的CLI HTTP Server都能吊打Java Tomcat?因为这时主要起作用的是C实现的代码,而不是PHP实现的代码,所以PHP会更快,这也是我为什么说PHP是反框架的语言,因为其自身就是C实现的Web框架,PHP应该关注业务实现,不是框架实现.这就是为什么大型PHP框架在Hello World测试中性能都那么烂.
下一页
0
咚往咚来
咚往咚来
如果你做中大型项目,越深入了解PHP,越觉得它不好用。当然,个人认为真能把PHP用好的,也是牛人。
行业协汇袁斌
行业协汇袁斌
回复 @咚往咚来 : @eechen 反动学术权威来挑战教主的威信了。。。
咚往咚来
咚往咚来
回复 @犯贱智障人士专职医生 : 对于QPS要求较高的应用,甚至你都会考虑到底要不要使用框架。由于不是常驻进程,和Java等常驻应用相比,同样的压测操作redis,PHP表现不理想。至于说一刀切,这个真没有,做网站和做接口,差事区别很大的。
路飞
路飞
具体问题具体分析嘛,最忌讳一刀切了
行业协汇袁斌
行业协汇袁斌
能否具体举例描述一下做大中型项目php为何不好用?
0
老陌
老陌

PHP-FPM 数量太少,建议先开 4倍CPU核心数  的数量试一试,

然后,APC这个扩展,看看有么有安装

测试的时候,看看load avg能打到多少,别只看cpu占用

老陌
老陌
回复 @路飞 : 还有PHP版本、配置什么的, 感觉这个机器内存太小了,但也不至于才这么差劲,应该是有优化空间的,多尝试下吧
老陌
老陌
回复 @路飞 : 装apc扩展了吗?还有建议做一个对比:1. 单压nginx 一般4K html文件,2 压单文件PHP echo 1; 即可。 有对比才能确认找到瓶颈,对吧
路飞
路飞
现状是我也说不清我们这个系统到底算cpu密集型还是io密集型了,不过实际情况是和cpu核数相同的php-fpm进程数的性能表现要比更多的php-fpm进程数更好
0
行业协汇袁斌
行业协汇袁斌

楼主是个好程序员, 这份钻研精神值得佩服,

很多所谓的程序员已经变得退化过度依赖搜索引擎了,

包括我自己,鄙视一下自己。。。

0
在我面前跪下
在我面前跪下

@路飞 原因找到了嘛,能说下ci是如何结合thrift的嘛

返回顶部
顶部