最新消息:

一次PHP下libcurl的性能优化

PHP ChinaUnix 82浏览 0评论

最近在和@无形的飞行,@sgub在升级业务环境时,遇到一系列问题。其中有个和PHP下curl扩展相关的性能优化,今天分享出来给大家。

我们的服务主要是nginx+PHP的环境的,在晚高峰流量大的时候,CPU总是首先成为瓶颈,如图1所示:

一次PHP下libcurl的性能优化

从这幅图看,晚高峰和白天比,CPU system time增长明显,并且消耗了大部分的CPU资源。通过perf可以看到PHP使用了大部分的CPU资源,基于已知的这两个条件,我们通过strace查了一下PHP进程的系统调用相关。通过分析,发现PHP在调用read函数的时间消耗偏长一些。如图2所示:

一次PHP下libcurl的性能优化

其中每次read函数平均耗时11毫秒,这个数字看起来比较奇怪,印象当中我们现在的read调用应该是远低于这个数字。于是打开strace记录文件,发现里边有大量针对文件/dev/urandom的read操作都发生在socket请求后端http接口之前,且每次操作耗时为几十到上百毫秒不等。对于这种大量访问urandom的行为不解之时,怀疑这个行为可能和libcurl有关系,于是找到@wen7ng 同学帮忙看看代码里边的线索,最终定位到这个是libcurl中关于dns异步解析的一个特性(感兴趣的同学可以搜索一下c-ares相关的知识),于是我们重新编译libcurl相关的包,把–enable-ares关闭,PHP中对urandom的操作消失,CPU在高峰时期system time占用高的问题也就解决了。如图3所示:

一次PHP下libcurl的性能优化

此时我大脑中带着两个问题,1. urandom在短时间内大量read操作时,效率怎么这么低;2. libcurl中的c-ares特性比较适合应用在什么环境下。

转载请注明:PHP学习 » 一次PHP下libcurl的性能优化

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址