PHP7은 일부 버그 수정과 최신 성능 개선 사항(NEWS) 중 하나인 "HugePageFy PHP TEXT 세그먼트"가 포함된 RC4를 출시했습니다. 이 기능을 활성화하면 PHP7은 자체 TEXT 세그먼트(실행 본문)를 변환합니다. ) ) Huagepage로 "이동"한 결과 WordPress에서 QPS가 2~3% 증가하는 것을 꾸준히 볼 수 있었습니다.
Hugepage가 무엇인지 간단히 말하면 기본 메모리는 4KB 단위로 페이징되며, 가상 주소와 메모리 주소를 변환해야 하며, 이 변환에는 테이블 조회 속도를 높이기 위해 테이블 조회가 필요합니다. , CPU는 내부적으로 TLB(Translation Lookaside Buffer)를 구축합니다. 가상 페이지가 작을수록 테이블의 항목 수가 많아지고 TLB 크기가 제한됩니다. 그래서 가능하다면 대용량 메모리 페이지를 활성화하면 이 TLB Cache Miss를 간접적으로 줄일 수 있습니다. 자세한 소개는 Google에서 많이 검색한 후에 자세히 설명하지 않겠습니다. 여기서는 주로 활성화하는 방법에 대해 설명합니다. 이 새로운 기능은 상당한 성능 향상을 가져올 것입니다.
새 커널에서 Hugepage를 활성화하는 것이 매우 쉬워졌습니다. 내 개발 가상 머신(Ubuntu Server 14.04, Kernel 3.13.0-45)을 예로 들면, 메모리 정보를 보면
$ cat /proc/meminfo | grep Huge AnonHugePages: 444416 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
볼 수 있습니다. Hugepage의 크기는 2MB이고 HugePages는 현재 활성화되어 있지 않습니다. 이제 PHP RC4를 먼저 컴파일하겠습니다. --disable-huge-code-pages를 추가하지 마십시오(이 새로운 기능은 기본적으로 활성화되어 있습니다. 추가하면 꺼집니다)
그런 다음 opcache를 구성합니다. PHP5.5부터 Opcache는 기본적으로 컴파일용으로 활성화되어 있지만 동적 라이브러리를 컴파일하는 데 사용되므로 여전히 php.ini에서 구성하고 로드해야 합니다. .
zend_extension=opcache.so
이 새로운 기능은 Opcache에 내장되어 있으므로 이 기능은 Opcache를 통해서도 활성화되어야 합니다(opcache.huge_code_pages=1 설정). 특정 구성:
opcache.huge_code_pages=1
이제 OS를 구성하고 일부 Hugepage를 할당해 보겠습니다.
$ sudo sysctl vm.nr_hugepages=128 vm.nr_hugepages = 128
이제 메모리 정보를 다시 확인해 봅시다:
$ cat /proc/meminfo | grep Huge AnonHugePages: 444416 kB HugePages_Total: 128 HugePages_Free: 128 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
우리가 할당한 128개의 Hugepages가 준비된 것을 볼 수 있으며, php-fpm을 시작합니다:
$ /home/huixinchen/local/php7/sbin/php-fpm [01-Oct-2015 09:33:27] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root [01-Oct-2015 09:33:27] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
이제 메모리 정보를 다시 확인해 보겠습니다:
$ cat /proc/meminfo | grep Huge AnonHugePages: 411648 kB HugePages_Total: 128 HugePages_Free: 113 HugePages_Rsvd: 27 HugePages_Surp: 0 Hugepagesize: 2048 kB
말하자면, Hugepages를 사용할 수 있는 경우 Opcache는 실제로 Hugepages를 사용하여 opcode 캐시를 저장하므로 opcache.huge_code_pages가 실제로 효과적인지 확인하기 위해 opcache.huge_code_pages를 끄고 다시 시작하여 메모리 정보를 살펴보는 것이 좋습니다.
$ cat /proc/meminfo | grep Huge AnonHugePages: 436224 kB HugePages_Total: 128 HugePages_Free: 117 HugePages_Rsvd: 27 HugePages_Surp: 0 Hugepagesize: 2048 kB
big_code_pages, fpm을 켠 후 시작 후 4개의 페이지가 더 사용된 것을 볼 수 있습니다. 이제 php-fpm의 텍스트 크기를 확인해 보겠습니다.
$ size /home/huixinchen/local/php7/sbin/php-fpm text data bss dec hex filename 10114565 695200 131528 10941293 a6f36d /home/huixinchen/local/php7/sbin/php-fpm
텍스트 세그먼트 크기가 10114565바이트임을 알 수 있습니다. , 총 4.8 정도의 2M 페이지가 필요합니다. 정렬을 고려하면(꼬리가 부족함) 2M 페이지 부분이 이동되지 않음), 정확히 4페이지를 신청하십시오.
구성이 성공했음을 나타냅니다! 즐겨보세요
하지만 먼저 이 기능을 활성화한 후에는 문제가 발생합니다. Perf 보고서/anno를 통해 프로파일링을 시도하면 기호가 누락되었음을 알 수 있습니다(valgrind, gdb는 영향을 받지 않음). 그 주된 이유는 Perf의 설계 때문입니다. mmap을 모니터링한 다음 주소 범위를 기록하고 IP를 기호로 변환합니다. 그러나 현재 HugeTLB는 MAP_ANON만 지원하므로 Perf는 주소의 이 부분에 기호 정보가 없다고 생각합니다. 향후 커널 버전에서는 이 제한 사항을 해결할 수 있습니다...
추천 튜토리얼: 《PHP7》
위 내용은 PHP7을 더 빠르게 만드는 Hugepage에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!