>  기사  >  백엔드 개발  >  PHP7을 더 빠르게 만드는 Hugepage에 대한 자세한 설명

PHP7을 더 빠르게 만드는 Hugepage에 대한 자세한 설명

Guanhui
Guanhui앞으로
2020-06-09 09:21:533159검색

PHP7을 더 빠르게 만드는 Hugepage에 대한 자세한 설명

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 laruence.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제