平均而言,我的 PHP 页面生成时间为 10ms。因此,我应该能够一个接一个地执行 100 个请求(使用服务器上的单个核心,因为该 php 不是多线程的)。
但是,我无法达到每秒 50 页的速度。截至目前,我的平均速度为 25 页/秒,负载适中。
该应用程序非常轻量,它由来自 SSD 池的读取(<5KB)组成,一些读取查询由索引解决。
我应该去哪里解决这个瓶颈?
答案1
平均而言,我的 PHP 页面生成时间为 10 毫秒。因此我应该能够一个接一个地执行 100 个请求
不,这是非常错误的。根据代码的功能,它应该是很多更多,如果写得不好,那么可能会少很多。
你是如何测量10ms的?
一些读查询通过索引解决。
这意味着一个数据库 - 但你甚至没有提到它,更不用说它实际上在做什么。
我无法达到每秒 50 页的速度
那么是什么限制了性能呢?磁盘 I/O、内存 I/O?CPU?
没有统计数据。没有代码。没有配置信息。抱歉,但我们比你更不清楚。
因为 php 不是多线程的
不 - 它是多处理的 - 或者至少应该是(除非它恰好处理消息队列而不是 Web 服务器请求)。如果您在 fastcgi 配置中只允许一个 PHP 实例(再次说明您没有说明您正在使用哪个 fastcgi 管理器),那么这可能是最大的瓶颈。
答案2
我不知道这是否会对您的问题有所帮助,但我还看到了与我们的一个项目类似的每秒请求数数字(我们使用 Apache Benchmark 来确定我们的 rps)。
我们意识到 PHP 本身就是瓶颈。在正常情况下,PHP 每次调用时都会解析所请求的 PHP 文件,从计算角度来说,这可能是一项耗时且昂贵的操作。我认为除了脚本的实际执行时间外,还包含每个 PHP 文件的启动和解析。
PHP-APC 是 PHP 的一个缓存模块,它将原始 PHP 脚本的操作码副本存储在内存中。由于它是在 RAM 中编译和存储的,因此它比未缓存的 PHP 快很多倍。
在我安装 PHP-APC 并重新启动服务器后,我们立即就能每秒发出超过 200 个请求。
正如我所说,它可能无法解决您的问题,但值得一试。
有关 PHP APC 的更多信息:http://php.net/manual/en/intro.apc.php