PHP8已发布挺久了,PHP8的JIT功能着实让PHP性能提升不少,先上图看下效果吧。
测试代码
php.php
<?php
function t(){
$r = 0;
for ($c = 0; $c < 1000000000; $c++) {
$r += $c;
}
}
t();
node.js
var r = 0;
for (var c = 0; c < 1000000000; c++) {
r += c;
}
golang.go
package main
func main() {
var r int
for c := 0; c < 1000000000; c++ {
r += c
}
}
java.java
// 编译 javac java.java
public class java {
public static void main(String[] args) {
int r= 0;
int c;
for (c = 0; c < 1000000000; c++) {
r += c;
}
}
}
c.c
//编译 cc -O2 c c.c
int main(int argc,char * argv[]){
int r= 0;
for (int c = 0; c < 1000000000; c++) {
r += c;
}
}
python.py
#!/usr/bin/python3
total=0
for i in range(1000000000):
total+=i
上段代码,用python 直接执行终端奔溃了,所以就没测试成功,感兴趣的同学可以自己用Cpython测试下。
rust/main.rs
//编译 cargo build -r
fn main() {
let mut sum:i64 = 0;
for i in 1..=1000000000 {
sum += i;
}
println!("1+2+..+100={}", sum);
}
启用JIT
php8才支持JIT,启用JIT前需要启用opcache。编辑php.ini 设置如下信息
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=100M //实际上是启用JIT的唯一设置项
opcache.jit=1255 //有默认值,不是必须设置。
配置说明 opcache.jit=CRTO
avxavx
应用大页内存提升性能
详情参考Laruence的博客文章
特性:默认的内存是以4KB分页的,而虚拟地址和内存地址是需要转换的, 而这个转换是要查表的,CPU为了加速这个查表过程都会内建TLB(Translation Lookaside Buffer), 显而易见如果虚拟页越小,表里的条目数也就越多,而TLB大小是有限的,条目数越多TLB的Cache Miss也就会越高, 所以如果我们能启用大内存页就能间接降低这个TLB Cache Miss。把TEXT段布置到大页内存(Huagepage)上,减少查TLB次数提升性能。
优点:在Wordpress上看到2%~3%的QPS提升。
缺点:尝试通过Perf report/anno 去profiling的时候, 会发现符号丢失(valgrind, gdb不受影响), 这个主要原因是Perf的设计采用监听了mmap,然后记录地址范围, 做IP到符号的转换, 但是目前HugeTLB只支持MAP_ANON, 所以导致Perf认为这部分地址没有符号信息。
sudo sysctl vm.nr_hugepages=128opcache.huge_code_pages=1--disable-huge-code-pagessize /home/huixinchen/local/php7/sbin/php-fpmcat /proc/meminfo | grep Huge