현재 위치: > 최신 기사 목록> CPU 사용 및 최적화 제안에 대한 Socket_set_block의 영향

CPU 사용 및 최적화 제안에 대한 Socket_set_block의 영향

gitbox 2025-05-29

socket_set_block의 역할과 영향

socket_set_block 함수의 주요 기능은 소켓을 차단 모드로 설정하는 것입니다. 차단 모드는 Socket_read 또는 Socket_write 와 같은 작업을 수행 할 때 데이터가 준비되지 않은 경우 데이터를 사용할 수 있거나 작업이 완료 될 때까지 프로그램이 일시 중지됩니다.

 <?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_block($socket);
socket_write($socket, "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n");
$response = '';
while ($out = socket_read($socket, 2048)) {
    $response .= $out;
}
socket_close($socket);
echo $response;
?>

위의 코드에서 Socket_set_block은 Socket_read가 데이터의 도착을 기다리며 즉시 반환되지 않도록합니다.

CPU 사용에 대한 차단 모드의 영향

  • 차단 모드의 장점 <br> 프로그램이 통화를 차단할 때 CPU는 다른 작업을 수행하기 위해 운영 체제에 릴리스됩니다. 다시 말해, CPU는 소켓 상태를 폴링하는 데 바쁘지는 않지만 수면으로 이동하여 운영 체제가 사용 가능한 데이터를 알릴 때까지 기다립니다. 이로 인해 CPU 사용량이 낮고 리소스가 합리적으로 활용됩니다.

  • 차단 모드의 단점 <br> 차단은 프로그램이 특정 호출 지점에서 중지된다는 것을 의미합니다. 네트워크 또는 피어 응답이 느리면 프로그램도 "고정"되어 다른 작업을 처리 할 수 ​​없습니다. 높은 동시성 시나리오에서는 차단 모드에서 여러 소켓을 사용하면 적용 응답이 느리게 발생할 수 있습니다.


높은 CPU 사용 및 최적화 솔루션의 이유

차단 모드는 당연히 CPU 사용량을 줄이는 데 도움이되지만 실제 응용 분야에서 비정상적으로 높은 CPU 사용 문제가 발생할 수 있습니다. 일반적인 이유는 다음과 같습니다.

  1. 자주 비 차단 폴링 (바쁜 대기)
    개발자가 비 블로킹 모드를 사용하거나 폴링 로직을 스스로 구현할 때 프로그램은 계속 읽기 기능을 호출하여 CPU가 바쁘게됩니다.

  2. 잘못된 차단/비 블로킹 모드 전환 <br> 소켓 상태 스위칭이 빈번하고 제대로 제어되지 않으면 시스템 호출의 비 효율성으로 이어질 수 있으며 CPU 부하가 증가 할 수 있습니다.

  3. 누락 된 이벤트 중심 또는 비동기 메커니즘 <br> 차단만이 다수의 소켓을 처리하는 데 사용되므로 프로그램이 여러 연결을 병렬로 처리 할 수 ​​없습니다.


최적화 방법

1. Socket_Select 또는 이벤트 중심 메커니즘을 사용하십시오

Socket_select는 여러 소켓 상태를 듣고 하나 이상의 소켓을 읽을 수 있고 바쁜 소켓을 읽을 수있을 때 작동 할 수 있습니다.

 <?php
$read = [$socket];
$write = $except = null;
if (socket_select($read, $write, $except, 5) > 0) {
    foreach ($read as $readableSocket) {
        $data = socket_read($readableSocket, 2048);
        // 처리 데이터
    }
}
?>

이런 식으로, 프로그램은 소켓에 데이터가있는 경우에만 깨어납니다.

2. 시간 초과 및 버퍼 크기를 합리적으로 설정하십시오

차단 모드에서는 장기 차단을 방지하기 위해 Socket_set_option을 통해 타임 아웃을 설정할 수 있습니다.

 <?php
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>3, "usec"=>0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ["sec"=>3, "usec"=>0]);
?>

버퍼 크기를 올바르게 조정하면 시스템 호출 수와 컨텍스트 전환이 줄어 듭니다.

3. 다중 프로세스 또는 멀티 스레드 처리를 활용하십시오

동시 응용 분야의 경우 여러 프로세스 또는 다중 스레드를 사용하여 전체 성능에 영향을 미치는 단일 프로세스 차단을 피하기 위해 차단하여 발생하는 병목 현상을 공유 할 수 있습니다.

4. 비동기 확장자 또는 라이브러리를 사용하십시오

PHP는 비 차단 및 이벤트 중심 모델을 지원하는 SwooleReactphp 와 같은 비동기 확장 기능을 갖추고 있으며 리소스 활용을 크게 개선하고 CPU 사용을 줄입니다.


요약

  • socket_set_block은 소켓 작동을 차단하고 CPU 유휴 상태를 줄이고 단일 연결의 효율성을 향상시킵니다.

  • 차단 모드는 높은 동시성 시나리오에서 느린 응용 프로그램 응답을 유발할 수 있습니다.

  • Socket_Select 와 같은 멀티플렉싱 기술을 결합하면 합리적으로 시간 초과 매개 변수를 설정하면 CPU 사용량이 크게 줄어들 수 있습니다.

  • 비동기식 또는 다중 프로세스 모델을 사용하는 것은 성능 및 자원 활용을 향상시키는 효과적인 수단입니다.

CPU에 대한 socket_set_block 의 영향의 원리를 이해하고 합리적인 최적화를 결합하면 PHP 네트워크 응용 프로그램이보다 효율적이고 안정적으로 만들 수 있습니다.