대부분의 웹 애플리케이션의 병목 현상은 IO, 즉 디스크 읽기 및 쓰기, 네트워크 읽기 및 쓰기, 데이터베이스 읽기 및 쓰기입니다. 이 기간을 기다리기 위해 어떤 전략을 사용할 것인지가 성능 향상의 핵심이 됩니다.
PHP의 전략: 여러 프로세스를 실행하고 IO가 완료될 때까지 직접 기다립니다. 단점: 여러 프로세스가 여러 메모리 복사본을 사용하므로 프로세스 간에 데이터를 공유하기가 어렵습니다.
일반적인 C/C 전략: 여러 스레드에서 실행되고 프로그램은 자체적으로 잠금 상태를 유지합니다. 단점: 개발 비용이 높고 오류가 발생하기 쉬우며 디버깅이 어렵습니다.
Python(Tornado): 단일 프로세스에서 여러 요청이 차례로 실행되고, IO가 발생하면 다른 요청으로 전환됩니다. 단점: 단일 요청에 대해 여전히 가장 효율적인 시간 사용은 아닙니다.
"가장 효율적인 시간 사용"이란 무엇입니까? 예를 들어, 관련되지 않은 두 개의 데이터베이스 쿼리가 있습니다. PHP에서는 일반적으로 하나가 먼저 실행되고 두 번째 쿼리는 실행이 완료된 후 실행됩니다(총 시간은 b입니다). 분명히 이것은 가장 효율적이지 않으며 두 쿼리 모두입니다. 동시에 실행되어야 합니다. is max(a, b).
위에서 비동기 IO 구현에 대해 논의했는데, 비동기 IO의 장점은 무엇인가요? 실제로 비동기 IO는 서버에 대한 부담을 마술처럼 줄일 수는 없습니다. 그러나 비동기 IO는 단일 요청 시간을 줄이고 의미 없는 대기 시간을 제거합니다. 단일 요청. 따라서 단위 시간당 처리되는 요청 수는 변하지 않지만, 각 요청의 처리 시간은 단축됩니다. 이러한 관점에서 서버는 일부 리소스, 즉 각 요청에 대한 연결을 유지하는 데 사용되는 메모리도 절약합니다.