配置JIT提高PHP8性能的实验笔记

配置JIT提高PHP8性能的实验笔记

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

  • C 指定是否在生成机器码时使用AVX指令, 需要CPU支持

    • 0 不使用
    • 1 使用

    终端执行以下命令可以用来检查CPU是否支持AVX指令
    $ inxi -Cxxx |grep avx
    Flags: avx avx2 ht lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx

  • R 寄存器分配策略

    • 0 不使用寄存器分配
    • 1 局部(block)域分配
    • 2 全局(function)域分配
  • T JIT触发策略

    • 0 PHP脚本载入的时候就JIT
    • 1 当函数第一次被执行时JIT
    • 2 在一次运行后,JIT调用次数最多的百分之(opcache.prof_threshold * 100)的函数
    • 3 当函数/方法执行超过N(N和opcache.jit_hot_func相关)次以后JIT
    • 4 当函数方法的注释中含有@jit的时候对它进行JIT
    • 5 当一个Trace执行超过N次(和opcache.jit_hot_loop, jit_hot_return等有关)以后JIT
  • O JIT优化策略

    • 0 不JIT
    • 1 做opline之间的跳转部分的JIT
    • 2 内敛opcode handler调用
    • 3 基于类型推断做函数级别的JIT
    • 4 基于类型推断,过程调用图做函数级别JIT
    • 5 基于类型推断,过程调用图做脚本级别的JIT

应用大页内存提升性能

详情参考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=128
  • 配置opcache
    opcache.huge_code_pages=1 注意:编译PHP时不要手工设置--disable-huge-code-pages禁用该特性
  • 验证
    • 查看text段大小
      size /home/huixinchen/local/php7/sbin/php-fpm
    • 查看内存状态
      cat /proc/meminfo | grep Huge

以上配置来源:
– PHP 8新特性之JIT简介
– PHP 8: How to setup the JIT

                       

点击阅读全文

上一篇 2023年 6月 9日 pm9:06
下一篇 2023年 6月 9日 pm9:07