首页 » 网站推广 » php运行排查技巧_linux情形lnmp机能分析排查思路

php运行排查技巧_linux情形lnmp机能分析排查思路

访客 2024-12-01 0

扫一扫用手机浏览

文章目录 [+]

整体情形

做事器配置8核32G200⼈在线CPU 100%涌现504和502iostat 正常netstat 正常top 创造FPM占⽤很⾼

排查思路确认拓扑图

php运行排查技巧_linux情形lnmp机能分析排查思路

可能的缘故原由MySql 慢查询应⽤做事器到MySql的⽹络问题MySql 到Redis 的⽹络问题代码性能确认缘故原由

php运行排查技巧_linux情形lnmp机能分析排查思路
(图片来自网络侵删)

定位代码性能问题PHP代码性能剖析工具Xhprof:⽆法掌握单个要求,不建议在线上利用Xdebug:可以掌握单个要求Strace:跟踪进程执⾏过程Perf+⽕焰图:强⼤的系统性能剖析⼯具gdb确定慢要求php-fpm 慢⽇志找出要求慢次数最多的要求

cat xxx.log | grep Action | awk '{print $2}' | sort | uniq

安装配置xdebug

有兴趣的可以看下《phpstorm配置xdebug 3.0最新教程》

要求剖析

这里就不放出详细的剖析了,大佬通过要求剖析,排查到可能一个开源组件包(包用场:设备类型匹配,匹配规则,5000+每次要求解析yml⽂件,并循环匹配,最新的包1W+)的代码,但是思考了成熟的开源组件该当不会有这么大的bug,又查找组件文档,加了缓存优化,末了还是一样的慢

连续剖析fpm慢⽇志

总结了以下问题,那又如何剖析呢? 咱们连续看大佬的破局之道

引⽤⽂件慢调⽤Redis慢数据库调⽤也慢所有要求都可能会慢,没有规律Strace ⼯具

利用

-p 指定跟踪的进程id-c 统计每个别系调⽤的韶光、调⽤次数,然后汇总报告-S 排序⽅式: ⽀持time, calls,name 默认是韶光strace -cp 1000 -S calls

strace -cp

调⽤⼤量韶光花费在munmap上,不符合常理关于PHP7.1的 Transparent HugePage(linux操作系统的一个优化特性,旨在提高大内存页的管理效率和系统性能。
通过减少页表的数量和管理开销,THP可以提高内存访问速率和运用程序的性能,但在支配时也须要考虑潜在的性能和稳定性问题)问题: https://www.linuxprobe.com/prodenv-upgrade-php7.html对⽅运维反馈没有开启Transparent HugePage

strace -p

⼤量的⽂件调⽤,⼀个要求600+每个⽂件调⽤都会伴随mmap和munmap,为什么?如何避免⼤量⽂件调⽤?Opcacheopcache.memory_consumption:opcache可⽤来存储编译后的PHP ⽂件⼤⼩, 建议⼤于256Mopcache.max_accelerated_files:opcache 可以缓存的最⼤⽂件数量, 建议2000旁边opcache.validate_timestamps: 检讨php⽂件更新韶光,设置为0。
发布怎么办?opcache.preload: 预加载⽂件, php7.4⽀持

峰值下去

Opcache 压测做事器效果300并发, opcache enable

300并发, opcache enable

300并发, opcache disable

300并发, opcache disable

QPS 五倍的差距,末了办理了问题

根本缘故原由的猜想munmap操作耗时,使⽤了swap。
项⽬⼤,本身include⽂件多导致swap为何导致性能问题,以及内存还⾜够,为何会⽤到swap: 《swap的罪与罚》 https://www.cnblogs.com/luoahong/articles/9122319.html

LNMP的常规优化

知识扩展-网络通信socket连接数

以下大部分内容来源于:网络通信socket连接数上限 - _学而时习之 - 博客园

关于socket

一个socket是由一个五元组来唯一标示的,即(协议,server_ip, server_port, client_ip, client_port)。
只要该五元组中任何一个值不同,则其代表的socket就不同。
这里忽略协议的差异,在同一协议的根本上,做事器真个listen socket的端口可以算作(server_ip, server_port, , ),个中是通配符,它跟任何一个client_ip, client_port值都不同,可以大略算作是(0,0)对,当然实现不是这样的。

这样在做事器端accept之后,返回的连接socket的四元组便是(server_ip, server_port, client_ip, client_port),这里的client_ip,client_port因连接的客户真个不同而不同。
以是accept返回的socket和listen socket是不同的,不同之处就在于四元组中的客户端ip和port,而做事器真个server_ip和server_port还是相同的,也便是accpet()函数返回的新的socket描述符的端口和listen端口是一样的。
可以利用getsockname()函数来查看它们之间的不同。

accept是又产生一个Socket端口吗?

要写网络程序就必须用Socket,这是程序员都知道的。
而且,口试的时候,我们也会问对方会不会Socket编程?一样平常来说,很多人都会说,Socket编程基本便是listen,accept以及send,write等几个基本的操作。
是的,就跟常见的文件操作一样,只要写过就一定知道。

对付网络编程,我们也言必称TCP/IP,彷佛其它网络协议已经不存在了。
对付TCP/IP,我们还知道TCP和UDP,前者可以担保数据的精确和可靠性,后者则许可数据丢失。
末了,我们还知道,在建立连接前,必须知道对方的IP地址和端口号。
除此,普通的程序员就不会知道太多了,很多时候这些知识已经够用了。
最多,写做事程序的时候,会利用多线程来处理并发访问。

我们还知道如下几个事实:

1.一个指定的端口号不能被多个程序共用。
比如,如果IIS占用了80端口,那么Apache就不能也用80端口了。

2.很多防火墙只许可特定目标端口的数据包通过。

3.做事程序在listen某个端口并accept某个连接要求后,会天生一个新的socket来对该要求进行处理。

如果一个socket创建后并与80端口绑定后,是否就意味着该socket占用了80端口呢?如果是这样的,那么当其accept一个要求后,天生的新的socket到底利用的是什么端口呢?

在TCP和UDP同属于传输层,共同架设在IP层(网络层)之上。
而IP层紧张卖力的是在节点之间(End to End)的数据包传送,这里的节点是一台网络设备,比如打算机。
由于IP层只卖力把数据送到节点,而不能区分上面的不同运用,以是TCP和UDP协议在其根本上加入了端口的信息,端口于是标识的是一个节点上的一个运用。
除了增加端口信息,UPD协议基本就没有对IP层的数据进行任何的处理了。
而TCP协议还加入了更加繁芜的传输掌握,比如滑动的数据发送窗口(Slice Window),以及吸收确认和重发机制,以达到数据的可靠传送。
不管运用层看到的是若何一个稳定的TCP数据流,下面传送的都是一个个的IP数据包,须要由TCP协议来进行数据重组。

TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要详细实现,同时还要供应对外的操作接口。
就像操作系统会供应标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外供应编程接口,这便是Socket编程接口--原来是这么回事啊!

在Socket编程接口里,设计者提出了一个很主要的观点,那便是socket。
这个socket跟文件句柄很相似,实际上在BSD系统里便是跟文件句柄一样存放在一样的进程句柄表里。
这个socket实在是一个序号,表示其在句柄表中的位置。
这一点,我们已经见过很多了,比如文件句柄,窗口句柄等等。
这些句柄,实在是代表了系统中的某些特定的工具,用于在各种函数中作为参数传入,以对特定的工具进行操作--这实在是C措辞的问题,在C++措辞里,这个句柄实在便是this指针,实际便是工具指针啦。

现在我们知道,socket跟TCP/IP并没有一定的联系。
Socket编程接口在设计的时候,就希望也能适应其他的网络协议。
以是,socket的涌现只是可以更方便的利用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。
比如create,listen,accept,connect,read和write等等。

现在我们明白,如果一个程序创建了一个socket,并让其监听80端口,实在是向TCP/IP协议栈声明了其对80端口的霸占。
往后,所有目标是80端口的TCP数据包都会转发给该程序(这里的程序,由于利用的是Socket编程接口,以是首先由Socket层来处理)。

所谓accept函数,实在抽象的是TCP的连接建立过程。
accept函数返回的新socket实在指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。
以是,accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变革的只是源IP和源端口。
这样的话,这些socket宿端口就可以都是80,而Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装!
而同时,防火墙的对IP包的处理规则也是清晰明了,不存在前面设想的各类繁芜的环境。

明白socket只是对TCP/IP协议栈操作的抽象,而不是大略的映射关系,这很主要!

单机最大的TCP连接数及其修正一个误解: 单个做事器程序可承受最大连接数“理论”上是“65535” .

65535这个数字的由来,很多人想当然地将它与port最大值联系起来。
的确,TCP的端口数,最大值确实为65535。
但是,这并不代表一个做事器可以接管的连接数便是这个值。
很多人之以是把这两个观点搞稠浊是由于对socket和port没有更深的认识和理解。
我们先来回想一下做事器做事的先落后程:

1、做事器创建监听socket

2、与对外做事的端口号绑定

3、开始listen

4、客户端连接到做事器对应的port

5、做事器accept为新的客户端产生新的socket

6、基于这个新的socket与客户端交流数据。

从以上流程来看,最大值为65535的“端口号”这个主要的东东,我们只用了一次,便是实行bind的时候!
而往后创建的socket,说白了便是一个可以进行网络IO操作的HANDLE而已。
通过查看该HANDLE的RemoteEndPoint能查看到远程客户端连接的IP和端口号(把稳,该端口是远程客户真个端口),查看该HANDLE的LocalEndPoint能看到该Socket的Ip和端口便是该做事绑定的IP和端口。
以是,accept的socket值与端口号无关,又何来65535的“理论”上限?

知识扩展-网络通信socket总结Socket和文件描述符:Socket是实现网络通信的一种机制,它由操作系统供应的一组API组成,用于创建、连接、发送和吸收数据等操作。
文件描述符是操作系统用于标识和管理打开文件、套接字、管道等资源的整数标识符。
TCP连接和文件描述符:在Web运用中,当有多个用户同时访问一个API链接时,做事器会创建多个TCP连接,并利用相应数量的文件描述符来管理这些连接。
Linux端口号和可用端口范围:Linux系统中,端口号范围是从0到65535,个中0到1023为有名端口、1024到49151为注册端口、49152到65535为动态或私有端口。
Linux系统最大文件描述符数:Linux系统中,最大文件描述符数常日默认为65535,但可通过调度内核参数来增加该限定。
优化内核参数:我们提到了一些优化内核参数的方法,如增加最大文件描述符数、调度TCP干系参数、优化TCP缓冲区、启用TCP快速打开等,以提高系统的性能和并发连接处理能力。
Web运用中的文件描述符利用情形:文件描述符紧张用于处理与文件系统干系的操作,以及进行网络通信。
在Web运用中,文件描述符常日用于处理文件读写、网络连接管理、日志记录等操作。
全文总结

希望这篇性能优化和socket理解对大家有帮助.

标签:

相关文章

人类语言萌芽,从声报到文字的奇妙旅程

人类语言,如同宇宙间的璀璨星辰,闪耀着智慧的光芒。它如同生命之源,孕育了文明的种子,见证了历史的变迁。追溯语言的起源,我们不禁要问...

网站推广 2024-12-27 阅读0 评论0

珀斯IT行业崛起,数字时代的璀璨明珠

近年来,随着全球经济一体化的加速推进,信息技术(IT)行业在全球范围内呈现出蓬勃发展的态势。我国西部地区作为国家战略的重要组成部分...

网站推广 2024-12-27 阅读0 评论0

真诚橘子IT,引领科技创新,赋能产业发展

随着科技的飞速发展,信息技术已成为推动社会进步的重要力量。在这个信息爆炸的时代,真诚橘子IT应运而生,以其独特的理念和创新的技术,...

网站推广 2024-12-27 阅读0 评论0