首頁 php教程 php手册 代码从业者的一次php应用优化实践

代码从业者的一次php应用优化实践

Jun 21, 2016 am 08:53 AM
cache cpu framework memcached

   系统跑得时间长了,总会出现这样那样的问题和瓶颈,有了问题不可怕,我们有“打虎”的家伙事儿--无非就是定位问题->分析问题->提出解决方案->实践->结果反馈->总结再优化。

  之前做过的一次优化实践,最近翻出来看看,有些通用的优化手段还是可以复用的。系统跑得时间长了,总会出现这样那样的问题和瓶颈,有了问题不可怕,我们有“打虎”的家伙事儿--无非就是定位问题->分析问题->提出解决方案->实践->结果反馈->总结再优化。

  问题描述:系统采用 PHP5 + Zend framework 开发,在数据规模和访问量增加后(千万级),出现了后台apache服务器负载过高的现象,在访问高峰时段(比如每天下班到晚上10点这一段时间,特别是周五),机器CPU负载会飙升到170多,CPU负载过高造成处理请求也相应的变慢,所以亟需解决这个问题。

  问题分析:通过连续几天的观察和分析,当CPU使用率达到100%时,其中系统CPU使用率占据了很大的比例,用户CPU使用率倒不是很高,另外前端 haproxy 和 squid cache的cpu负载很低,memcached和squid的hit ratio一般都能达到60%左右。

  分析backend的access-log,发现相当大一部分请求的User-Agent是搜索爬虫;

  同时,在 apache 上配置了xdebug,在空闲时段对主要的页面的测量了一组性能数据,通过使用kcachegrind对测得的数据进行分析(如何配置xdebug,可以用soso搜一下),发现:

  性能数据不够稳定,同样的请求之间测试数据会相差比较大

  慢的点比较分散

  memcached的访问大部分的情况都比较慢(100ms以上)

  解决方案通过上述初步的分析,对现有的程序逐步作了一系列调整。

  首先考虑到的是是否可以想办法增加前端squid cache的Hit ratio,从而减少穿透squid到达后端apache的请求数。

  考虑到相当一部分请求来源于Crawler,而之前squid cache只会对设置了language cookie的请求作cache,而来自Crawler的请求都没有cookie信息。于是想到把来自Crawler的请求都默认为language为zh_CN的,然后修改haproxy的配置,把User-Agent为常见的Crawler的请求都转交给squid cache.

  修改php代码,把一些页面的缓存时间设置得更长一些

  经过如上两个步骤,到达apache的请求确实减少了一些,但是这个对cpu负载过高的问题帮助很少,于是另寻它法。

  其次,根据使用 xdebug profiling的结果来看,和memcached的交互耗时比较长,于是想是否可以想办法让memcached能更快地响应请求,从而使得每一次请求能更快完成,从而使并发降低。

  通过代码分析,发现线上memcached使用的是poll(),而memcached的连接数在繁忙的时候保持在1000左右,memcached的CPU使用率在 30% 左右。很显然,poll()方式在处理如此多的并发连接时是很低效的。于是重新编译memcached,使其使用epoll()的方式来处理请求,替换为epoll之后,memcached的cpu usage从 30%左右降低到 3% 左右,10倍之多!

  另外,memcached的hit ratio不是特别高,而且被换出的item数也比较高,于是想到对cache的内容作partition.原本打算做 manually partition,后来发现php的最新的memcache扩展就能支持根据cache的key自动作partition,而且能在不修改程序代码(需要修改配置文件:-))的情况下增加新的memcached实例。于是升级每一个apache的php memcache扩展,然后再配置文件中增加了一台新的memcached。到此完成memcached的内容partition。修改之后的效果比较显著,页面的载入时间比修改前缩短了很多。

  经过这两步的调整,memcached的效率比以前高了,但是apache的负载仍然居高不下,没辙,再想其它办法!

  进一步深入分析前面说到主要系统CPU占用很高,要找原因只能深入内核了:) 从现在开始了我们的strace之旅。套用一句Nike的广告词:Just strace it!

  在高峰时段对 httpd 进程进行了strace,方法不外乎如下这些

  strace -p PID -c 得出 summary

  strace -p PID -o output.log 写入文件,慢慢研究

  strace -p PID -e trace=file 只看 filesystem 操作相关的 syscalls

  strace -p PID -elstat64,stat64,open,getcwd 只跟踪这些 syscalls

  …

  从上述strace分析得到如下结论:

  lstat64,stat64,open等 syscalls实在是多啊

  上述 syscalls 占用时间确实不少! 60%以上的时间都被它们抢了, orz

  绝大多数 syscall 是失败的,真是屡败屡战啊

  有了上述数据,我们就找到了问题的方向了,那就是找这些毫无意义的系统调用是怎么来的。

  经过分析,这些是php要加载某一个类时,会去 include_path 中定义的一系列目录中搜寻该类对应的文件,挨个目录这么试过去,直到找到为止。嗯,这种方式显然是比较低效的,有没有更好的方式来完成这个事情呢?答案是肯定的,有!而且还有不止一种方法!

  调用require_once()时,参数写绝对路径(开始Guys write Zend Framework就不懂这个道理;后来才有更新))

  使用 __autoload()对class进行 lazy loading,也就是说真正需要的时候才去加载,而不是不管三七二十一把可能用到的类文件都require_once了。

  问题是找到了,但是要解决这个问题还面临着另一个问题。开发中代码都注意用绝对路径了,唯一可以改进的地方是改为 lazy loading,但是 Zend Framework中大量的require_once采用相对路径,这个就是导致问题——这里我说的问题是本文我们谈论的CPU负载过高的问题——的根本原因。

  OK,既然问题找到了,动手解决。写个脚本自动生成 Class -> File Path 对应关系,生成代码中所有类和Zend Framework中所有类的对应关系文件。把代码中和Zend Framework库中所有的 require_once 都注释掉。然后进行详细的测试,然后上线。结果令人吃惊,负载降到了 3 以内!!问题解决。

  总结:

  写代码的人都知道,可能出问题的地方总会出问题,任何问题都会有个原因(哪怕暂时没有找到),从根上解决才是王道,解决什么问题不重要,希望大家能学习这个解决的思路,善于利用工具。ok,这个case就这样了。




本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
在遊戲時,CPU利用率應該是多少? 在遊戲時,CPU利用率應該是多少? Feb 19, 2024 am 11:21 AM

遊戲因消耗大量資源而導致電腦運作速度變慢是常見現象。了解遊戲時CPU的使用率是至關重要的,這樣可以避免過度負荷。因此,掌握適當的CPU使用率是維持遊戲體驗流暢的關鍵。在本文中,我們將探討遊戲執行時間CPU應該達到的適當使用率。遊戲時的CPU使用率CPU使用率是指衡量處理器工作負載的重要指標,取決於CPU的效能規格。功率較大的CPU通常具有更高的使用率。擁有更多核心和執行緒的CPU可以提高系統的整體效能。多執行緒支援有助於充分發揮CPU的潛力。在遊戲中,CPU使用率取決於處理器的使用率,這會影響遊戲

Win11如何設定CPU效能全開 Win11如何設定CPU效能全開 Feb 19, 2024 pm 07:42 PM

許多使用者在使用Win11系統時發現電腦運作不夠流暢,想要提升CPU效能,但不清楚如何操作。以下將詳細介紹如何在Win11系統中設定CPU效能至最高,讓您的電腦更有效率。設定方法:1、右鍵點選桌面上的”此電腦”,選擇選項清單中的”屬性”。 2、進入到新的介面後,點選”相關連結”中的”高級系統設定”。 3、在開啟的視窗中,點選上方中的」進階」選項卡,接著點選」效能」下方中的&

如何增加電腦CPU的時脈頻率 如何增加電腦CPU的時脈頻率 Feb 20, 2024 am 09:54 AM

電腦CPU如何超頻隨著科技的不斷進步,人們對於電腦效能的需求也越來越高。而一個有效的提升電腦效能的方法就是透過超頻(overclocking)來增加CPU的工作頻率。超頻可以使CPU更快地處理數據,從而提供更高的運算能力。那麼,電腦CPU如何超頻呢?以下將為大家介紹超頻的基本原理和具體操作方法。首先,讓我們來了解一下超頻的原理。 CPU的工作頻率是由主機板上的晶振

cpu盒裝和散裝的區別 cpu盒裝和散裝的區別 Jan 23, 2024 am 09:46 AM

cpu盒裝和散裝的區別:1、品質;2、保固期;3、風扇;4、價格;5、包裝;6、銷售通路。詳細介紹:1、質量,無論是盒裝還是散裝,CPU本身的品質是沒有任何差別的,它們都由同一生產廠家製造,經過相同的品質測試和品質控制流程;2、保固期,盒裝CPU通常提供更長的保固期,一般為三年,而散裝CPU通常只有一年的保固期,這是因為盒裝CPU通常是由官方或授權的經銷商銷售的等等。

如何使用Intel XTU對CPU進行欠壓與超頻 如何使用Intel XTU對CPU進行欠壓與超頻 Feb 19, 2024 am 11:06 AM

英特爾XTU是一款強大的應用程序,可讓您輕鬆管理電腦的效能。您可以透過調整CPU電壓來解決過熱問題,或透過超頻來提升效能。在這篇文章中,我們將探討如何利用英特爾XTU來最佳化電腦的效能,無論是調整電壓或進行超頻。欠壓和超頻對CPU有什麼作用?在我們繼續學習如何對CPU進行欠壓和超頻之前,首先必須了解它們是什麼。欠電壓指的是逐漸降低CPU所需的電壓。這個過程有助於減少熱量排放,因為高電壓會導致更高的溫度。透過減少CPU的電壓供應,可以有效降低溫度。如果筆記本在發熱後開始減速,應及時解決問題

144 核心,3D 堆疊 SRAM:富士通詳細介紹下一代資料中心處理器 MONAKA 144 核心,3D 堆疊 SRAM:富士通詳細介紹下一代資料中心處理器 MONAKA Jul 29, 2024 am 11:40 AM

本站7月28日消息,根據外媒TechRader報道,富士通詳細介紹了計劃於2027年出貨的FUJITSU-MONAKA(以下簡稱MONAKA)處理器。 MONAKACPU基於「雲端原生3D眾核」架構,採用Arm指令集,面向資料中心、邊緣與電信領域,適用於AI運算,能實現大型主機層級的RAS1。富士通表示,MONAKA將在能源效率和性能方面實現飛躍:得益於超低電壓(ULV)製程等技術,該CPU可實現2027年競品2倍的能效,冷卻無需水冷;此外該處理器的應用性能也可達對手2倍。在指令方面,MONAKA配備的向量

WIN10服務主機太佔cpu的處理操作過程 WIN10服務主機太佔cpu的處理操作過程 Mar 27, 2024 pm 02:41 PM

1.首先我們右鍵點選任務列空白處,選擇【任務管理器】選項,或右鍵開始徽標,然後再選擇【任務管理器】選項。 2.在開啟的任務管理器介面,我們點選最右邊的【服務】選項卡。 3.在開啟的【服務】選項卡,點選下方的【開啟服務】選項。 4.在開啟的【服務】窗口,右鍵點選【InternetConnectionSharing(ICS)】服務,然後選擇【屬性】選項。 5.在開啟的屬性窗口,將【開啟方式】修改為【禁用】,點選【應用程式】後點選【確定】。 6.點選開始徽標,然後點選關機按鈕,選擇【重啟】,完成電腦重啟就行了。

洩漏揭示了英特爾 Arrow Lake-U、-H、-HX 和 -S 的關鍵規格 洩漏揭示了英特爾 Arrow Lake-U、-H、-HX 和 -S 的關鍵規格 Jun 15, 2024 pm 09:49 PM

英特爾ArrowLake預計將基於與LunarLake相同的處理器架構,這意味著英特爾全新的LionCove效能核心將與經濟體的Skymont效率核心結合。

See all articles