수신 버퍼가 너무 작 으면 Socket_RecVMSG 가 자주 호출되어 시스템 호출 오버 헤드가 증가합니다. 버퍼가 너무 커지면 메모리를 낭비 할 수 있습니다. 응용 프로그램 시나리오에 따라 버퍼 크기를 조정하는 것이 좋습니다.
<span><span><span class="hljs-variable">$buf_size</span></span><span> = </span><span><span class="hljs-number">8192</span></span><span>; </span><span><span class="hljs-comment">// 패킷 크기와 처리량에 따라 조정하십시오</span></span><span>
</span><span><span class="hljs-variable">$msg</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_recvmsg</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$buf_size</span></span><span>);
</span></span>다른 버퍼 크기의 처리량 및 대기 시간 테스트는 최적화의 중요한 단계입니다.
Socket_RecVMSG가 호출 될 때마다 수신기가 하나의 작은 메시지 만 읽으면 기능 호출 및 CPU 컨텍스트 전환이 증가합니다.
해결책:
가능하면 여러 메시지를 함께 보내십시오.
수신 종료시 한 번에 더 많은 데이터를 읽은 다음 포장을 풀어보십시오.
php에서 socket_recvmsg는 매번 데이터를 PHP 변수에 복사합니다. 최적화를 위해 :
참조 패스를 사용하거나 기본 버퍼를 직접 처리하십시오.
먼저 변수를 읽은 다음 다른 배열로 전송하는 등 여러 번 반복 된 사본을 피하십시오.
고성능 요구 사항의 경우 PHP 확장 또는 FFI를 고려하여 메모리를 직접 작동시킬 수 있습니다.
다른 소켓 유형과 프로토콜은 성능에 큰 영향을 미칩니다.
UDP 소켓은 일반적으로 작은 메시지 시나리오에서 TCP보다 더 효율적입니다.
TCP 소켓은 큰 트래픽 또는 안정적인 전송에 적합하지만 Nagle 알고리즘이 지연을 유발할 수 있습니다.
TCP 소켓의 경우 Nagle 알고리즘을 비활성화 할 수 있습니다.
<span><span><span class="hljs-title function_ invoke__">socket_set_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_TCP, TCP_NODELAY, </span><span><span class="hljs-number">1</span></span><span>);
</span></span>응용 프로그램이 동시 시나리오가 높은 경우 차단 작업을 최소화하십시오.
수신 루프에서 수면 ()을 사용하지 마십시오.
socket_select 또는 stream_select를 사용하여 단일 socket_recvmsg를 차단하는 대신 여러 소켓을 듣습니다.
대규모 네트워크 응용 프로그램의 경우 Libevent 또는 ReactPHP 사용과 같은 이벤트 중심 모델은 데이터 도착 이벤트를보다 효율적으로 처리 할 수 있습니다.
이 접근법은 폴링과 유휴 대기를 줄여 CPU 사용 및 처리량을 향상시킵니다.
socket_recvmsg 성능을 최적화하기위한 핵심 아이디어는 다음과 같습니다.
비 블로킹 모드 + 이벤트 구동 .
합리적인 버퍼 크기 및 배치 읽기 .
데이터 복사를 줄입니다 .
적절한 소켓 유형과 프로토콜을 선택하십시오 .
시스템 호출 차단을 피하십시오 .
상기 방법을 종합적으로 적용함으로써 Socket_recvmsg 의 성능은 특히 높은 동시성 및 대규모 데이터 볼륨 시나리오에서 PHP에서 크게 향상 될 수 있습니다.