우리는 PHP7의 성능을 향상시키기 위해 열심히 노력해 왔습니다. 지난 달 우리는 GCC의 PGO가 WordPress에서 거의 10%의 성능 향상을 가져올 수 있다는 사실을 발견했습니다.
그러나 이름에서 알 수 있듯이 PGO(Profile Guided Optimization, 관심이 있는 경우 Google)는 피드백을 얻기 위해 일부 사용 사례를 사용해야 하며, 이는 이 최적화가 특정 시나리오에 바인딩되어야 함을 의미합니다. .
한 시나리오의 최적화는 다른 시나리오에서 역효과를 낳을 수 있습니다. 따라서 이러한 최적화를 단순히 포함할 수도 없고 PGO에서 컴파일한 PHP7을 직접 출시할 수도 없습니다.
Of 물론 우리는 PGO에서 몇 가지 일반적인 최적화를 찾아 수동으로 PHP7에 적용하려고 노력하고 있지만 이는 분명히 장면에 대한 특수 최적화가 얻을 수 있는 효과를 얻을 수 없기 때문에 이 기사를 작성하여 PGO 사용 방법을 간략하게 소개하기로 결정했습니다. PHP7을 컴파일하여 컴파일한 PHP7이 자신만의 독립 애플리케이션을 더 빠르게 만들 수 있도록 합니다.
우선, 가장 먼저 결정해야 할 것은 Feedback GCC를 사용할 장면입니다. 우리는 일반적으로 다음을 선택합니다. 원하는 시나리오에서 최적화: 방문자가 가장 많고, 시간이 가장 많이 걸리고, 리소스 소모가 가장 많은 페이지
워드프레스를 예로 들어, 우리는 워드프레스 홈페이지를 선택합니다(홈페이지가 가장 많이 방문하는 경우가 많기 때문입니다). .
제 컴퓨터를 예로 들어 보겠습니다.
<ol> <li><span><span>Intel(R) Xeon(R) CPU X5687 @ 3.60GHz X 16(超线程), </span></span></li> <li><span> </span></li> <li><span>48G Memory </span></li> </ol>
php-fpm은 고정된 32개의 작업자를 사용하고 opcache는 기본 구성을 사용합니다(특정 opcache 로드를 기억하세요)
최적화 시나리오로 wordpress 4.1을 사용합니다..
먼저 PHP7에서 WP의 현재 성능을 테스트합니다(ab -n 10000 -c 100):
<ol> <li><span><span>$ ab -n 10000 -c 100 http:</span><span>//inf-dev-maybach.weibo.com:8000/wordpress/</span><span> </span></span></li> <li><span> </span></li> <li><span>This is ApacheBench, Version 2.3 <<span>$Revision</span><span>: 655654 $> </span></li> <li><span> </span></li> <li><span>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http:<span>//www.zeustech.net/</span><span> </span></span></li> <li><span> </span></li> <li><span>Licensed to The Apache Software Foundation, http:<span>//www.apache.org/</span><span> </span></span></li> <li><span> </span></li> <li><span>Benchmarking inf-dev-maybach.weibo.com (be patient) </span></li> <li><span> </span></li> <li><span>Completed 1000 requests </span></li> <li><span> </span></li> <li><span>Completed 2000 requests </span></li> <li><span> </span></li> <li><span>Completed 3000 requests </span></li> <li><span> </span></li> <li><span>Completed 4000 requests </span></li> <li><span> </span></li> <li><span>Completed 5000 requests </span></li> <li><span> </span></li> <li><span>Completed 6000 requests </span></li> <li><span> </span></li> <li><span>Completed 7000 requests </span></li> <li><span> </span></li> <li><span>Completed 8000 requests </span></li> <li><span> </span></li> <li><span>Completed 9000 requests </span></li> <li><span> </span></li> <li><span>Completed 10000 requests </span></li> <li><span> </span></li> <li><span>Finished 10000 requests </span></li> <li><span> </span></li> <li><span>Server Software: nginx/1.7.12 </span></li> <li><span> </span></li> <li><span>Server Hostname: inf-dev-maybach.weibo.com </span></li> <li><span> </span></li> <li><span>Server Port: 8000 </span></li> <li><span> </span></li> <li><span>Document Path: /wordpress/ </span></li> <li><span> </span></li> <li><span>Document Length: 9048 bytes </span></li> <li><span> </span></li> <li><span>Concurrency Level: 100 </span></li> <li><span> </span></li> <li><span>Time taken <span>for</span><span> tests: 8.957 seconds </span></span></li> <li><span> </span></li> <li><span>Complete requests: 10000 </span></li> <li><span> </span></li> <li><span>Failed requests: 0 </span></li> <li><span> </span></li> <li><span>Write errors: 0 </span></li> <li><span> </span></li> <li><span>Total transferred: 92860000 bytes </span></li> <li><span> </span></li> <li><span>HTML transferred: 90480000 bytes </span></li> <li><span> </span></li> <li><span>Requests per second: 1116.48 [#/sec] (mean) </span></li> <li><span> </span></li> <li><span>Time per request: 89.567 [ms] (mean) </span></li> <li><span> </span></li> <li><span>Time per request: 0.896 [ms] (mean, across all concurrent requests) </span></li> <li><span> </span></li> <li><span>Transfer rate: 10124.65 [Kbytes/sec] received </span></li> </ol>
볼 수 있습니다 현재 이 컴퓨터에는 WordPress 4.1이 있고 홈페이지의 QPS는 1116.48에 도달할 수 있습니다. 즉, 초당 홈페이지에 대한 많은 요청을 처리할 수 있다는 것입니다.
이제 GCC 교육을 시작하겠습니다. WordPress 4.1을 더 빠르게 실행하는 PHP7을 컴파일하려면 먼저 GCC 4.0 이상이 필요하지만 모든 사람이 GCC-4.8 이상(현재는 모두 GCC-5.1)을 사용하는 것이 좋습니다.
먼저 첫 번째 단계는 물론, PHP7의 소스 코드를 다운로드한 다음 ./configure를 수행하는 것입니다.
다음 단계에서는 먼저 PHP7을 컴파일하고 프로필을 생성해야 합니다. 데이터 실행 파일:
<ol><li><span><span>$ make prof-gen <br></span></span></li></ol>
prof-gen 매개변수를 사용했다는 점에 유의하세요(이것은 PHP7의 Makefile에 고유하므로 다른 프로젝트에서 동일하게 수행하지 마십시오.) )
그런 다음 GCC 교육을 시작하겠습니다.
<ol><li><span><span>$ sapi/cgi/php-cgi -T </span><span>100</span><span> /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/</span><span>null</span><span> </span></span></li></ol>
즉, WordPress 홈페이지에서 php-cgi를 100번 실행하여 그 과정에서 일부 프로필 정보를 생성하도록 합니다.
그런 다음, 두 번째로 PHP7 컴파일을 시작했습니다.
<ol> <li><span><span>$ make prof-clean </span></span></li> <li><span>$ make prof-<span>use</span><span> && make install </span></span></li> </ol>
자, 간단합니다. PGO 컴파일이 완료되었습니다. 이제 PGO 컴파일 후 PHP7의 성능을 살펴보겠습니다.
<ol> <li><span><span>$ ab -n10000 -c </span><span>100</span><span> http:</span><span>//inf-dev-maybach.weibo.com:8000/wordpress/</span><span> </span></span></li> <li><span> </span></li> <li><span>This is ApacheBench, Version <span>2.3</span><span> <$Revision: </span><span>655654</span><span> $> </span></span></li> <li><span> </span></li> <li><span>Copyright <span>1996</span><span> Adam Twiss, Zeus Technology Ltd, http:</span><span>//www.zeustech.net/</span><span> </span></span></li> <li><span> </span></li> <li><span>Licensed to The Apache Software Foundation, http:<span>//www.apache.org/</span><span> </span></span></li> <li><span> </span></li> <li><span>Benchmarking inf-dev-maybach.weibo.com (be patient) </span></li> <li><span> </span></li> <li><span>Completed <span>1000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>2000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>3000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>4000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>5000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>6000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>7000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>8000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>9000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Completed <span>10000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Finished <span>10000</span><span> requests </span></span></li> <li><span> </span></li> <li><span>Server Software: nginx/<span>1.7</span><span>.</span><span>12</span><span> </span></span></li> <li><span> </span></li> <li><span>Server Hostname: inf-dev-maybach.weibo.com </span></li> <li><span> </span></li> <li><span>Server Port: <span>8000</span><span> </span></span></li> <li><span> </span></li> <li><span>Document Path: /wordpress/ </span></li> <li><span> </span></li> <li><span>Document Length: <span>9048</span><span> bytes </span></span></li> <li><span> </span></li> <li><span>Concurrency Level: <span>100</span><span> </span></span></li> <li><span> </span></li> <li><span>Time taken <span>for</span><span> tests: </span><span>8.391</span><span> seconds </span></span></li> <li><span> </span></li> <li><span>Complete requests: <span>10000</span><span> </span></span></li> <li><span> </span></li> <li><span>Failed requests: <span>0</span><span> </span></span></li> <li><span> </span></li> <li><span>Write errors: <span>0</span><span> </span></span></li> <li><span> </span></li> <li><span>Total transferred: <span>92860000</span><span> bytes </span></span></li> <li><span> </span></li> <li><span>HTML transferred: <span>90480000</span><span> bytes </span></span></li> <li><span> </span></li> <li><span>Requests per second: <span>1191.78</span><span> [#/sec] (mean) </span></span></li> <li><span> </span></li> <li><span>Time per request: <span>83.908</span><span> [ms] (mean) </span></span></li> <li><span> </span></li> <li><span>Time per request: <span>0.839</span><span> [ms] (mean, across all concurrent requests) </span></span></li> <li><span> </span></li> <li><span>Transfer rate: <span>10807.45</span><span> [Kbytes/sec] received </span></span></li> </ol>
이제 초당 1191.78 QPS를 처리할 수 있는데, 개선율은 ~7%입니다. 나쁘지 않습니다. (야, 10%라고 하지 않았어? 왜 7%인 거지? ㅎㅎ 아까 말했듯이 우리는 PGO를 분석하려고 합니다. 어떤 최적화를 하려고 합니까? 그런 다음 몇 가지 일반적인 최적화가 PHP7에 수동으로 적용됩니다. 즉, 보다 일반적인 최적화의 ~3%가 PHP7에 포함되었으며 물론 이 작업은 계속 진행 중입니다.
그래서 이렇게 간단합니다. 몇 가지 간단한 단계를 통해 자신의 제품의 클래식 장면을 사용하여 개선할 수 있습니다. :)
감사합니다
기사는 PHP 마스터——Brother Bird @Laruence의 작품입니다. 원본 주소: http://www.laruence.com/2015/06/19/3063.html
위 내용은 PHP 7을 더 빠르게 만들기 위해 GCC PGO를 소개한 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.