热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP8.0JIT介绍,及如何在PHP8中设置JIT

PHP8.0JIT介绍,及如何在PHP8中设置JIT|PHP8在PHP的内核中添加了JIT(即时编译)编译器,可以极大地提高性能。纯解释程序语言没有编译步骤,可

PHP 8在PHP的内核中添加了JIT(即时编译)编译器,可以极大地提高性能。

解释程序语言没有编译步骤,可以直接在虚拟机中执行代码。实际上,包括PHP在内的大多数解释型语言都有一个轻量级的编译步骤来提高其性能。

另一方面,使用Ahead-Of-Time(AOT)编译进行编程的语言要求在运行代码之前首先对其进行编译。

即时编译是解释器和提前编译的混合模型,部分或全部代码通常在运行时进行编译,而无需开发人员手动进行编译。

PHP历史上是一种解释语言,所有代码都是由虚拟机(Zend VM)解释的。通过引入由PHP代码生成的Opcache和Opcodes,可以对此进行更改,并且可以将其缓存在内存中。PHP 7.0添加了AST(抽象语法树)的概念,该概念进一步将解析器与编译器分离。

PHP的JIT内部使用LuaJIT的DynASM,并作为Opcache的一部分实现。

深入
了解JIT有关最佳JIT配置,基准以及JIT如何工作的详细指南

Opcache可以检查使用的代码(通常称为热代码),并将它们的编译版本存储在共享的Opcache内存中。什么时候应该编译代码,什么时候应该编译代码是可配置的。

平台支持

当前在运行在x86和x64处理器指令集上的Linux和Windows系统上启用了JIT。当前不支持Apple M1和ARM CPU。

DynASM是PHP JIT中使用的编译器,它也支持ARM指令,但是尚不清楚PHP JIT是否可以在ARM处理器上运行。

如果CPU支持JIT,则JIT也可以使用AVX。2011年及以后的大多数消费者和服务器级处理器都支持AVX指令。cat /proc/cpuinfo | grep avx在大多数POSIX系统上运行的处理器应显示处理器是否支持它。

配置JIT

关于对实际Web应用程序的实际影响,需要做一些旁注,这就是为什么我对JIT的性能进行一些基准测试的原因(我也在脚注中列出了所有相关参考资料)。

我还想写一篇有关如何设置JIT的博客文章,因为有很多事情要讨论。

老实说,设置JIT是我见过的配置PHP扩展最混乱的方法之一。幸运的是,有一些可用的配置速记,因此更容易设置。深入了解JIT配置仍然是一件好事,所以在这里说明。

首先,仅在启用opcache的情况下,JIT才有效,这是大多数PHP安装的默认设置,但您应确保opcache.enablephp.ini文件中将其设置为1 。通过在php.ini中指定opcache.jit_buffer_size来启用JIT本身。

请注意,如果您通过命令行运行PHP,则还可以通过-d标志传递这些选项,而不是将它们添加到php.ini

php -dopcache.enable=1 -dopcache.jit_buffer_size=100M

如果不包含此伪指令,那么默认值将设置为0,并且JIT将不会运行。如果要在CLI脚本中测试JIT,则需要使用opcache.enable_cli来启用opcache:

php -dopcache.enable_cli=1 -dopcache.jit_buffer_size=100M

opcache.enableopcache.enable_cli之间的区别是,如果要运行,例如内置的PHP服务器则应该使用前者。如果您实际上正在运行CLI脚本,则需要opcache.enable_cli

在继续之前,让我们确保JIT确实有效,创建一个可通过浏览器或CLI访问的PHP脚本(取决于您测试JIT的位置),并查看以下输出opcache_get_status()

var_dump(opcache_get_status()['jit']);

输出应该是这样的:

array:7 [
  "enabled" => true
  "on" => true
  "kind" => 5
  "opt_level" => 4
  "opt_flags" => 6
  "buffer_size" => 4080
  "buffer_free" => 0
]

如果enabledon是正确的,那您就对了!

设置JIT标志(opcache.jit

opcode.jit是有点复杂的配置值。它接受disableonofftracefunction,和按顺序排列的 4 个不同标志的 4 位值。

  • disable:在启动时完全禁用JIT功能,并且在运行时无法启用。
  • off:禁用,但是可以在运行时启用JIT。
  • on:启用tracing模式。
  • tracing:细化配置 的别名1254
  • function:细化配置 的别名1205

粒度配置

tracingfunction别名外,该opcache.jit伪指令还接受4位数字的配置值。它可以进一步配置JIT行为。

4位配置值的格式为CRTO,其中每个位置均允许字母表示的标志的单个数字值。

有关完整的配置选项,请参见JIT标志。

默认值为tracing,它在运行代码(跟踪)时编译热代码(调用图),并允许使用CPU寄存器和AVX扩展

接下来,有几种配置JIT的方法(这是我们讨论配置混乱的地方)。您可以配置JIT运行的时间,应该尝试优化的数量等等。所有这些选项都使用一个配置条目配置:opcache.jit! 它可能看起来像这样:

opcache.enable=1 
opcache.jit=1255

JIT标志

现在,这个数字是什么意思?该RFC列出他们每项的意义。请注意:这不是位掩码,每个数字仅表示一个配置选项。RFC列出了以下选项:

#O-优化级别

0 不要JIT
1 最小JIT(调用标准VM处理程序)
2 选择性VM处理程序内联
3 基于单个函数的静态类型推断的优化JIT
4 基于静态类型推断和调用树的优化JIT
5 基于静态类型推断和内部过程分析的优化JIT

#T — JIT触发器

0 JIT第一次脚本加载时的所有函数
1 首次执行时JIT函数
2 在第一个请求时进行概要分析,并在第二个请求时编译热函数
3 动态分析并编译热函数
4 在文档注释中使用@jit标记编译函数
5 跟踪JIT

#R-寄存器分配

0 不执行寄存器分配
1 使用本地线性扫描寄存器分配器
2 使用全局线性扫描寄存器分配器

#C — CPU特定的优化标志

0 没有
1 启用AVX指令生成

一个问题:RFC以相反的顺序列出了这些选项,因此第一个数字代表C值,第二个数字代表值R,依此类推。为什么我不理解为什么根本没有添加四个配置条目,可能是为了更快地配置JIT?

无论如何,内部人员建议将1255作为最佳默认设置,它将最大程度地jitting,使用跟踪JIT,使用全局线性扫描寄存器分配器(无论如何)并启用AVX指令生成。

因此,您的ini设置(或-d标志)应具有以下值:

opcache.enable=1 
opcache.jit_buffer_size=100M
opcache.jit=1255

请记住,这opcache.jit是可选的。如果忽略该属性,则JIT将使用默认值。

您问哪个默认值?那会是opcache.jit=tracing

等等,那不是我们之前看到的奇怪的类似于位掩码的结构吗?没错:在原始RFC通过之后,内部人员意识到,类似于位掩码的选项并不是所有的用户友好选项,因此他们添加了两个别名,这些别名被转换为底层的位掩码。有opcache.jit=tracingopcache.jit=function

两者之间的区别在于,函数JIT仅会尝试在单个函数的范围内优化代码,而跟踪JIT可以查看整个堆栈跟踪以识别和优化热代码。内部人员建议使用跟踪JIT,因为它几乎总是可以提供最佳结果。您可以在我完成的基准测试中了解这些结果。

因此,您实际上需要设置的唯一选项以启用最佳配置来启用JIT是 opcache.jit_buffer_size,但是如果您要明确一点,列出opcache.jit并不是一个坏主意:

opcache.enable=1 
opcache.jit_buffer_size=100M
opcache.jit=tracing

调试JIT(opcache.jit_debug

PHP JIT提供了一种通过设置INI配置来发出JIT调试信息的方法。设置后,它将输出汇编代码以供进一步检查。

opcache.jit_debug=1

opcache.jit_debug指令接受位掩码值以切换某些功能。当前,它接受的值范围是1(0b1)至20位二进制。值1048576表示调试输出的最大级别。

php -d opcache.jit_debug=1 test.php
TRACE-1$/test.php$7: ; (unknown)
    sub $0x10, %rsp
    mov $EG(jit_trace_num), %rax
    mov $0x1, (%rax)
.L1:
    cmp $0x4, 0x58(%r14)
    jnz jit$$trace_exit_0
    cmp $0x4e20, 0x50(%r14)
    ...

更多配置选项

JIT支持其他几种配置选项,以调整多少个函数调用使其成为“热”函数(由JIT编译),以及一个阈值,以根据总函数调用的百分比来考虑要对JIT进行选择的函数。

有关完整列表,请参见Opcache配置。

向后兼容性影响

没有。JIT是PHP 8.0中新增的一项功能,不会引起任何问题。当遇到未知的INI指令时,PHP不会引发任何警告或错误,这意味着设置JIT INI指令不会引起任何问题。

参考 https://php.watch/versions/8.0/JIT

原文 https://stitcher.io/blog/php-8-jit-setup 原创翻译:转载请注明来自lenix的博客,地址https://blog.p2hp.com/archives/7577

最后更新于 2020年12月6日


推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
  • 本文介绍了Hive常用命令及其用途,包括列出数据表、显示表字段信息、进入数据库、执行select操作、导出数据到csv文件等。同时还涉及了在AndroidManifest.xml中获取meta-data的value值的方法。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了go接口相关的知识,希望对你有一定的参考价值。一、接口是什么接口提供了一种方式来 说明 对象的行为 ... [详细]
  • Openresty+Lua+Redis灰度发布
    Openresty+Lua+Redis灰度发布灰度发布,简单来说,就是根据各种条件,让一部分用户使用旧版本,另一部分用户使用新版本。百度百科中解释:灰度发布是指在黑与白之间,能够平 ... [详细]
  • cocos2dx-lua使用UIListView制作二级折叠菜单
    折叠菜单,用过jqueryaccordion的同学都知道是啥玩艺儿~,图片效果就是介样:cocos2dx不带有此控件,因此我们动手来实现一个。原理很简单,展开的时候往listview里i ... [详细]
  • Server Installation for Jitsi Meet
    2019独角兽企业重金招聘Python工程师标准ServerInstallationforJitsiMeetThisdescribesconfiguringaserverji ... [详细]
  • redis知识汇总[随笔记录]
      ... [详细]
  • 基于Redis实现分布式锁剖析
    之前的文章《分布式锁详解-分别利用Zookeeper和数据库实现分布式锁》,由于篇幅太长,又碰上加班时间不够充裕,所以没有把Redis的实 ... [详细]
  • 《计算机专业英语基础知识》由会员分享,可在线阅读,更多相关《计算机专业英语基础知识(25页珍藏版)》请在人人文库网上搜索。1、专业英语知识补充,本章学习 ... [详细]
author-avatar
天天宅家里变胖的小黑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有