我的 php-fpm 进程在 Ubuntu 14.04 LTS(Nginx 服务器,MariaDB 数据库)上面临性能问题。
strace -f $(pidof php-fpm7.1 | sed 's/\([0-9]*\)/\-p \1/g')
给我
<... epoll_wait resumed> {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 103) = 0
[pid 32533] epoll_wait(8, <unfinished ...>
[pid 32535] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933fdd000
[pid 32535] munmap(0x7fd933fdd000, 2097152) = 0
[pid 32535] mmap(NULL, 4190208, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933dde000
[pid 32535] munmap(0x7fd933dde000, 139264) = 0
[pid 32535] munmap(0x7fd934000000, 1953792) = 0
[pid 32535] madvise(0x7fd933e00000, 2097152, MADV_HUGEPAGE) = 0
[pid 32533] <... epoll_wait resumed> {}, 1, 897) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, <unfinished ...>
[pid 32535] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933c00000
[pid 32535] madvise(0x7fd933c00000, 2097152, MADV_HUGEPAGE) = 0
[pid 32533] <... epoll_wait resumed> {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, <unfinished ...>
[pid 32535] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933a00000
[pid 32535] madvise(0x7fd933a00000, 2097152, MADV_HUGEPAGE) = 0
[pid 32533] <... epoll_wait resumed> {}, 1, 1000) = 0
[pid 32533] epoll_wait(8, <unfinished ...>
[pid 32535] open("/usr/share/zoneinfo/UTC", O_RDONLY) = 7
[pid 32535] fstat(7, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0
[pid 32535] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 20) = 20
[pid 32535] lseek(7, 0, SEEK_SET) = 0
[pid 32535] mmap(NULL, 118, PROT_READ, MAP_SHARED, 7, 0) = 0x7fd946835000
[pid 32535] close(7) = 0
[pid 32535] munmap(0x7fd946835000, 118) = 0
[pid 32535] pwrite(5, "_sf2_attributes|a:2:{s:14:\"_secu"..., 979, 0) = 979
[pid 32535] close(5) = 0
[pid 32535] mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd933200000
[pid 32535] madvise(0x7fd933200000, 2097152, MADV_HUGEPAGE) = 0
我尝试使用 php-fpm7.0、PHPMod7.1 但同样的问题。
对于数据量较小的请求,CPU 占用率高达 100%。
配置是默认的。
在重复的实例上 php5.6-fpm 运行良好。
编辑:可能相关PHP script keeps doing mmap/munmap
编辑:我尝试启用大页面 https://wiki.debian.org/Hugepages
cat/proc/meminfo | grep 巨大的 给了我
AnonHugePages: 108544 kB
HugePages_Total: 512
HugePages_Free: 497
HugePages_Rsvd: 50
HugePages_Surp: 0
Hugepagesize: 2048 kB
还是一样的问题。
编辑:我尝试启用/禁用 OPCache,还设置了 opcache.huge_code_pages=0,但没有结果。 http://php.net/ 上没有关于大页面的文档
最佳答案
我不是 100% 确定我们是否在这里面临同样的问题,但这是我在 Stack Overflow 中搜索我的问题时能找到的最接近的东西。
我的发现是在具有以下规范的虚拟机上。
CPU:16
内存:16GB
操作系统:Ubuntu 16.04.4 LTS
容器:使用 block 设备的 ZFS 文件系统的 LXD
PHP 版本:7.1
我正在运行一些运行 MariaDB、Nginx 和 PHP-FPM 7.1 的 LXD 容器。这些是开发环境,所以我只是访问服务器的流量。运行的应用程序是使用 Symfony 框架构建的。
我注意到页面加载时间非常慢。我会一直等待一分钟以上,让页面以开发模式加载。我也没有花那么多时间来确认这一点,但 CLI 脚本也感觉很慢。我尝试调整各种 PHP 设置(真实路径缓存、opcache 开/关/各种设置等)但没有任何效果。
我可以始终跟踪其中一个 PHP-FPM 进程,并看到一个系统调用似乎很慢。所有其他调用都会轻而易举地过去,但在整个过程的生命周期中,它多次卡在以下调用上。
madvise(0x7f4dcca00000, 2097152, MADV_HUGEPAGE) = 0
长话短说,我能够通过禁用 THP 来彻底改变此应用程序的性能。我在 LXD 主机上运行了以下命令,页面加载时间像白天和黑夜一样变化。
sysctl -w vm.nr_hugepages=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
我知道 Redis 建议禁用 THP,因为与写时复制相关的性能问题。我也知道 ZFS 文件系统也进行写时复制,所以也许这个问题是相关的?
关于php-fpm7.1 mmap/munmap(非常)在虚拟化系统上性能低下(hugepage),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45013646/
我有一个博客。在我的索引页面上,我拉入了所有博客文章。对于每篇博客文章,我都会计算该文章的评论数。这会导致N+1问题。我的查询如下所示:SELECT"blog_posts".*FROM"blog_posts"WHERE("blog_posts"."published"='t')ORDERBYpublished_atDESCSELECT"users".*FROM"users"WHERE("users"."id"IN(1,2,3))SELECTCOUNT(*)FROM"blog_comments"WHERE("blog_comments".blog_post_id=10)SELECTCOU
我有点不确定如何使用react-virtualized实现列表的动态高度.我有一个组件如下:import{List}from'react-virtualized';{return100;//Thisneedstomeasurethedom.}}rowRenderer={({key,index,style})=>}}width={300}/>我看过使用CellMeasurer根据文档说它可以与List组件一起使用,但我不知道这个例子实际上是如何工作的......我还尝试弄清楚它是如何在democode中实现的但也走到了死胡同。有人可以帮助我了解如何测量DOM以动态获取每个项目的高度。
GPU池化和虚拟化属于计算机体系结构的技术领域,它的本质是进行异构算力的解耦和共享。痛点分析:1.之前的做法,如果有一张卡,哪怕只用了1%的计算能力,剩下的99%也无法被利用了,所以算力有耦合不可分。2.虽然任何一张独立的卡无法满足需求,但是多张卡的算例总和是可以达到算力要求的。随着人工智能的发展,其对算例的需求呈现指数级增长,自从2012年以来,全球算力需求增长超过30万倍,以GPU为代表的人工智能芯片是支撑算力的核心部件。GPU服务器占据了50%以上的AI算力市场份额,且GPU芯片的价格占到整台服务器成本的80%以上,然而,大部分用户的GPU利用率都比较低,只有10%~30%.其核心原因在
虚拟化的工作原理是直接在物理服务器的硬件或主机操作系统上面运行一个称为虚拟机管理程序(Hypervisor)的虚拟化系统。通过虚拟机管理程序,多个操作系统可以同时运行在单台物理服务器上,共享服务器的硬件资源。虚拟机管理程序Hypervisor一般分为两类:类型1(裸金属架构)和类型2(寄居架构)。类型1虚拟机管理程序直接运行在硬件之上,也称为裸金属架构(BareMetalArchitecture),如VMwareESXi、微软Hyper-V、开源的KVM(Linux内核的一部分)和Xen等。类型2虚拟机管理程序则需要主机安装有操作系统,由主机操作系统负责提供I/O设备支持和内存管理,也称为寄居
目录什么是超融合(HCI)简介超融合和云计算的区别超融合和虚拟化的区别与虚拟化对比来解释超融合超融合的技术特点超融合的优势和限制超融合应用场景超融合厂商云计算(一)云是什么(二)云计算是什么(三)特点(四)云资源的部署模式(五)云计算的优劣势(六)云计算的服务类型(七)云计算的核心理念(八)云厂商超融合和云计算的区别bandaoyu地址:https://blog.csdn.net/bandaoyu/article/details/125227509?spm=1001.2014.3001.5502以下内容主要参考or摘抄自:超融合和云计算-https://zhuanlan.zhihu.com/p
我不是Go不安全包专家-我也不是经验丰富的C程序员。我正在尝试使用mmap系统调用读取一个大于1G的大文件。我使用mmap和munmap而不是读取、写入I/O的原因有很多。那不是重点-我可以在测试中写入文件,当我从文件中读取时,我可以确定字节长度匹配,但我无法读取该字符串文件的内容:(有人可以建议阅读吗?我需要做的更进一步,这是我为示例测试编写的一些代码:filename:="/tmp/dd_file.db"f,err:=os.OpenFile(filename,os.O_RDWR,0666)deferf.Close()iferr!=nil{fmt.Printf("erroropeni
我偶尔需要从大型XML数据库导出中提取数据。文件大小在600到700MB之间。经过几天的研究,我得出结论XML::Twig是要走的路,因为它的处理程序允许我逐块处理文件。我按照示例进行操作,经过数小时的反复试验,我编写了执行我需要完成的工作的Perl代码。代码有效,它提取了我想要的数据并计算了我需要的细节。但是在运行脚本时(处理620MB的XML需要大约15分钟),我在事件监视器中注意到,到最后内存使用率迅速增加到不合理的高水平。我删除了处理我感兴趣的XML标签的Perl代码,并用一条指令替换它来增加一个变量,只需计算product的数量。元素已被发现。内存使用情况类似。首先是正常的,
我知道这可能会被认为是重复的,但通过查看我能找到的问题,我并没有找到答案我在Mac上开发网站,显然我需要在各种版本的InternetExplorer中测试它们。特别是因为我的很多工作都是纯粹的客户端编码,所以像browsershots.org这样的服务不会削减它。此外,我在我的机器上本地运行一个Web堆栈,我需要访问它。到目前为止,我在VMWare中使用多个虚拟机以及不同版本的Windows和IE进行了相当困惑的设置。它可以工作,但它并不优雅或易于维护。此外,启动所有这些虚拟机也很痛苦。所以:我想获得Windows7,只使用它,并摆脱其他版本和VPC。据我了解,我可以使用Microso
我正在开发一个旨在与旧C++应用程序结合运行的程序。一款名为奇迹时代的游戏。在WindowsVista或Windows7(启用UAC)下运行时,游戏保存文件将写入虚拟路径而不是真实路径。例如;原文:C:\ProgramFiles(x86)\奇迹时代\保存虚拟化:C:\Users\用户名\AppData\Local\VirtualStore\ProgramFiles(x86)\AgeofWonders\Save在我的.Net应用程序中,我从电子邮件服务器下载文件并将它们放在“保存”文件夹中,如果我尝试写入原始路径,我会在启用UAC时收到未经授权的访问异常。Windows不会为我自动将其转
我正在使用桌面复制将屏幕内容复制到内存中的位图中。我收到桌面纹理,然后创建暂存纹理,使用CopyResource将桌面纹理复制到暂存纹理中,最后调用ID3D11DeviceContext::Map访问暂存纹理位和复制它们。与此处描述的方式几乎相同:https://stackoverflow.com/a/27283837/825318问题是Map调用需要花费大量时间-对于4K等大型显示分辨率,每次调用最多可能需要100毫秒,这高得令人无法接受,因为我需要确保30fps速度。有没有什么办法可以更快的获取贴图的内容?如果没有,有没有办法提供我自己的映射地址指针,以便系统将纹理数据复制到那里?