Mcrypt响应慢的一个原因
作者遇到一个棘手问题:一个新上线的PHP脚本在并发20个请求时,Apache响应时间急剧飙升,但服务器CPU、内存等各项指标却完全正常。脚本使用了Mcrypt扩展进行加密操作。 问题的根源藏在一个看似不起眼的函数调用里:`mcrypt_create_iv`。作者发现,当未显式指定参数时,该函数在Linux下默认使用`/dev/random`来生成初始化向量。而`/dev/random`的工作原理是依赖系统的中断事件来积累熵池(随机性来源)。在并发请求较多、但系统本身又不够繁忙、中断产生不足的情况下,进程就会阻塞等待足够的随机数可用,从而导致整体响应缓慢,这正是“服务器指标正常但响应慢”的诡异现象。 解决办法是,在调用时显式指定使用`/dev/urandom`作为随机源,即添加`MCRYPT_DEV_URANDOM`参数。因为`/dev/urandom`不依赖系统中断,能够持续提供随机数。修改后,高并发下的延迟问题立即消失。 作者也补充了背景:PHP之所以默认选择可能阻塞的`/dev/random`,是因为理论上`/dev/urandom`在极端情况下可能被预测,安全性在设计上有细微的取舍。这也提醒我们,在查阅官方文档时,下方的用户评论往往藏着解决实际“坑”的关键线索。