서버의 부하가 꽤 높습니다(초당 수백 요청). 대부분은 SSL을 통해 이루어집니다.
문제는 HTTPS를 통해 서버에 대한 첫 번째 요청이 데이터베이스가 관련되지 않은 경우에도 매우 느린 응답(예: 10초)을 만난다는 것입니다. 다음 요청은 눈 깜박임으로 실현됩니다. 동시에 SSL이 없으면 지속적으로 빠르게 작동합니다. 며칠 전에는 상황이 반전되었습니다. 대부분의 트래픽에 SSL 개미가 없었고 SSL 없이는 빨랐고 SSL에서는 느렸습니다.
SSL을 통해 연결하기를 원하지만 약 10초 수준의 활동이 잠시 중단된 후 첫 번째 응답은 허용되지 않습니다. 첫 번째 느린 응답을 피하기 위해 아마도 apache2 구성에서 무엇을 변경할 수 있습니까?
답변1
키 교환에서 CPU에 바인딩된 것 같습니다. 일반적인 문제. 클라이언트가 처음으로 SSL/TLS를 통해 연결하면 (계산 비용이 매우 많이 드는) 키 교환이 이루어집니다. 이 키 교환이 완료된 후 클라이언트는 다음 통신에서 교환에서 얻은 키를 재사용할 수 있습니다. 이것이 HTTPS를 통한 첫 번째 요청을 완료하는 데 너무 많은 시간이 걸리는 이유입니다.
리소스를 추가하는 것 외에는 이 상황에 대해 할 수 있는 일이 거의 없습니다. CPU가 많을수록 키 교환 계산 속도가 빨라집니다. 더 많은 메모리는 항상 좋습니다. 클라이언트가 키 교환을 다시 실행하지 않도록 생성된 키를 메모리에 더 오랫동안 유지하도록 Apache를 구성할 수도 있습니다.
암호 슈트를 변경하거나 키 길이를 조정하여 성능을 약간 향상시킬 수도 있지만 일반적으로 번거로움을 겪을 가치는 없습니다.
이런 종류의 로드를 오랫동안 실행하려면 SSL/TLS 계산을 오프로드하는 것이 좋습니다. 선호하는 프록시를 사용하여 별도의 상자, SSL 가속 카드 또는 특수 SSL/TLS 오프로딩 상자를 얻을 수 있습니다.
답변2
DNS 문제인 것 같습니다. DNS가 localhost에 구성되어 있고 제대로 작동하는지 확인하고, 또한 확인하십시오.호스트 이름 조회아파치 구성에서는 지시어가 off로 설정되어 있습니다.
답변3
제가 생각할 수 있는 시나리오는 두 가지입니다.
- Apache의 로그를 확인하고 이를 통해 뭔가 영리하게 만드십시오(오류, 액세스 로그 타임스탬프 등). 제 생각에는 이것이 쉽지 않은 것 같습니다.
- 또는: SSL 핸드셰이크 프로토콜이 어떻게 진행되는지 Wireshark에 제안합니다. 서버 측 또는 클라이언트 측에서 10초가 경과하는 위치를 확인해야 합니다. 키스토어를 여는 것 같은 작업은 시간이 많이 걸릴 것 같지만, 처음에는 네트워크 트래픽을 스니핑하여 타임스탬프를 확인해야 합니다. 어떻게 되었는지 알려주세요!
답변4
문제가 발견되었습니다. KeepAlive를 꺼야했습니다.
매초마다 새로운 연결이 많이 발생했습니다(초당 200~300개, 때로는 그 이상). 대부분은 5초 동안 연결을 유지할 필요가 없었습니다. 결과적으로 연결 풀이 빠르게 활용되었으며 모든 새 연결은 5초 후에 이전 연결이 종료될 때까지 기다려야 했습니다.
KeepAlive 옵션은 대부분의 사용자가 KeepAliveTimeout 매개변수(예: 제 경우에는 5초)에 지정된 작업을 수행하는 동안 서버가 열린 연결을 충분히 유지할 수 있는 경우에만 유용한 것으로 보입니다.
다른 경우에는 실제로 끄는 것이 유용합니다.