저는 거의 동일한 두 서버에서 MySQL과 PHP가 포함된 Windows Server 2016의 IIS를 사용하고 있습니다. 최근에 두 대의 서버 중 하나에서 속도가 느려지는 것을 발견했지만 이는 내 사이트가 동시에 여러 스크립트 인스턴스를 실행하려고 할 때만 발생합니다. 그들은 서로 붙어있는 것 같습니다.
완벽한 예는 내 검색 페이지입니다. 사용자가 검색어를 입력할 때 각 키를 누를 때마다(두 번째 문자 이후) 마지막 키를 누른 후 최소 200ms의 지연이 있는 한 검색이 실행됩니다. 따라서 빠르게 입력하는 경우 마지막에 한 번만 검색하지만 느린 입력자(키를 누르는 사이에 200ms 이상 기다리는 사용자)의 경우 검색 결과에 대한 여러 호출이 트리거됩니다. 이 스크린샷을 참조하세요.
보류 중인 모든 요청을 확인하세요. 이 스크린샷에서 첫 번째 요청은 19.08초에 방금 완료되었습니다. 분명히 너무 길어요. 모두 완료되면 간단한 결과 집합을 반환하는 데 15초가 훨씬 넘습니다.
이러한 쿼리는 MySQL Workbench에서 실행될 때와 이 문제가 발생하지 않는 다른 서버에서 실행될 때에도 1초도 채 걸리지 않는다는 점을 명심하십시오. 이 스크린샷(좋은 서버의)에서 정확히 동일한 검색이 1/4초 안에 반환되는 것을 확인하세요.
(나쁜 서버에서는) 어떤 이유로든 동시에 실행할 수 없는 것 같습니다. 단일 검색만 실행하면(단일 검색만 실행할 수 있을 만큼 빠르게 입력하여) 빠르게 돌아오기 때문입니다. 이렇게 여러 번 실행하면 교통 체증처럼 모두 막히게 됩니다. 이 문제의 원인은 무엇입니까?
다음 스크린샷은 불량 서버에서 단일 검색만 실행할 경우의 결과를 보여줍니다. 보시다시피 매우 빠르게 돌아옵니다. 따라서 문제는 동일한 스크립트를 여러 개 동시에 실행할 때만 발생합니다.
최근에 불량 서버에 몇 가지 변경을 했지만 제가 기억하는 한 유일하게 변경한 것은 더 큰 파일 업로드를 허용하는 것이었습니다.
- PHP에서는 post_max_size = 500M을 늘렸습니다.
- PHP에서는 upload_max_filesize = 500M을 늘렸습니다.
- IIS에서는 UploadReadAheadSize를 49152000으로 늘렸습니다.
- IIS에서는 허용되는 최대 콘텐츠 길이를 300000000으로 늘렸습니다.
내가 기억할 수 없는 다른 변경 사항을 이 서버에 적용했을 수도 있습니다.
일시적인 해결책
검색할 때 키 누르기 사이에 더 긴 지연을 허용하여 이 문제를 완화할 수 있으며, 이를 800ms로 늘려서 느린 타자 사용자도 이 문제를 볼 수 없지만 이것은 단지 임시방편일 뿐이며 그렇지 않습니다. 내 사이트의 다른 영역에도 영향을 미치는 근본적인 문제를 해결합니다.
내가 시도한 것
지금까지 나는 IIS 구성, MySQL 구성(my.ini) 및 PHP 구성(php.ini)이 두 서버 모두에서 중요한 모든 면에서 모두 동일하다는 것을 확인했습니다(적어도 나에게 분명해 보이는 한). . 또한 이 검색에서 실행 중인 select 문이 MySQL Workbench에서 실행할 경우 두 서버 모두에서 동일하게 잘 수행된다는 것도 확인했습니다. 이 문제가 발생하는 것은 내 웹 앱에서만 발생합니다.
만일을 대비해 더 큰 파일을 업로드하기 위해 IIS에 적용한 두 가지 변경 사항을 일시적으로 취소했지만 별 차이가 없는 것 같았습니다.
나는 또한 LeanSentry를 다운로드하여 설치했는데, 이는 내 사이트에서 차단된 요청을 보았다고 하루에 한두 번 경고합니다. 나는 이것이 내가 여기서 보고 있는 것과 정확히 일치한다고 가정하지만 불행히도 LeanSentry는 ASP 문제의 원인만 정확히 찾아낼 수 있습니다. PHP가 아닌 페이지. 따라서 본질적으로 문제가 있다는 사실만 확인해줄 뿐 그 이상으로는 도움이 되지 않습니다.
기타 증상
여러 보고서를 동시에 열면 비슷한 문제가 발생합니다. 다음 보고서를 열기 전에 한 보고서의 로드가 완료되도록 허용하면 모두 빠르게 로드되지만, 앱에서 여러 보고서를 동시에 열도록 강제하면 모두 중단됩니다.
이러한 병목 현상 문제의 원인은 무엇입니까?
답변1
나는 IIS 서버가 여기에 문제가 있다고 생각하지 않습니다. 검색하는 모든 것은 코드에서 새로운 호출을 요청하고 PHP 스크립트 내부의 무언가처럼 보이는데 시간이 오래 걸립니다.
새로운 요청을 보낼 때마다 새로운 PHP 인스턴스를 차단하게 되며, PHP에 인스턴스가 부족해지면 충돌이 발생합니다.
검색 PHP 파일 내에서 무엇을 하고 있는지 알기는 어렵지만 일부 SQL 서버나 검색할 항목을 호출하고 있는 것 같습니다. 코드 내에서 검색 쿼리를 주석 처리하고 동일한 테스트를 수행할 수 있습니까?
지금은 내가 할 수 있는 최선을 다해 추측하고 있는데, SQL 데이터베이스에서 정규식이나 유사한 함수를 사용하고 있는 것처럼 들리며, 행이 많으면 호출하는 속도가 매우 느려서 많이 멈추는 것 같습니다.
하지만 다시 말씀드리지만 제가 하라고 한 테스트 결과를 너무 늦게 알게 된 것 같아요.
답변2
HTML 렌더링으로 인해 중단이 발생한 것으로 나타났습니다. 검색 결과가 길면 브라우저가 모든 HTML을 렌더링하는 데 오랜 시간이 걸리고, 그 동안 다음 요청을 처리할 수 없었습니다.
검색 결과를 50개 행으로 제한하여 문제를 해결했습니다. 이제 HTML이 거의 즉시 렌더링되고 다음 요청이 실행될 수 있습니다. 따라서 요청을 차단한 것은 IIS가 아니라 브라우저였습니다.