Mr. Time To First Byte의 이상한 사례


14

Linode 1024 VPS 기반 웹 서버가 있습니다.

  • 우분투 11.10
  • Nginx 1.0.5
  • PHP 5.3.6 (PHP-FPM, APC 사용)
  • 광택 3.0.2

그리고 WordPress 3.3.1을 기반으로 한 두 개의 블로그가 있습니다. 그중 하나는 서버를 테스트하기 위해 기본 구성, 테마 및 "Hello World"게시물이있는 일반 블로그입니다. 다른 하나는 거의 10k 개의 게시물과 10k 개 이상의 댓글이있는 다른 서버에서 복제 된 블로그입니다. 이 블로그에는 하루에 5k 개의 고유 항목이 있습니다.

서버는 테스트 블로그 에 대한 ab 테스트에서 좋은 숫자를 제공 하지만 복제 된 블로그를 사용한 동일한 테스트는 불가능합니다 .ab 테스트는 서버를 너무 많이로드하고 프로세스를 중지해야합니다. 이것은 정말 가난한 결과 입니다.

htop은 정상 작동 시 "정상"부하를 나타내지 만 ab 테스트 중에는 큰 큰 부하를 보여줍니다 .

또 다른 이상한 일이 있습니다 (나에게 가장 중요한 것) : 첫 번째 바이트까지의 시간이 매우 높지만 그 후에 사이트가 실제로 빨리로드됩니다. 이 결과를 제공하는 tools.pingdom.com과 같은 서비스를 사용하여 쉽게 테스트 할 수 있습니다 . "대기 시간"을 의미하는 노란색 영역에주의하십시오.

왜 이런 일이 발생합니까? 가능한 아이디어 :

  • 잘못된 PHP-FPM 구성
  • Linode DNS 응답 시간이 끔찍합니다. 넌센스-테스트 블로그는 DNS를 잘 해결합니다 .TTFB는 환상적입니다.
  • 나쁜 Nginx 설정

더 많은 정보가 필요한 사람은


나는 이것이 nginx 설정 if -flocation컨테이너에서 사용 하는 지시문 과 관련이 있다고 생각합니다 . 내가 읽고있는 내용 wiki.nginx.org/Pitfalls에 따르면 -f, 특히 파일이 많은 디렉토리가있는 경우 Time To First Byte 문제를 일으킬 수있는 파일을 비효율적으로 검색 하는 느낌 이 있습니다. 파일.
d34dh0r53

1
몇 가지 생각 : a) 블로그가 복제 된 원래 서버와 다른 점은 무엇입니까 (예 : 동일한 스택을 실행합니까?) b) 가능하면 localhost와 포트를 사용하여 서버에서 ab를 직접 실행하십시오. 니스를 통해 액세스 한 다음 nginx에 직접 액세스하십시오). c) MySQL 및 PHP-FPM 느린 로그를 활성화합니다. d) mysqltuner.pl을 실행하고 MySQL 성능을 향상시킬 수 있는지 확인하십시오 (블로그 또는 플러그인 간의 가장 명백한 차이). e) 게시 한 PHP-FPM 설정이 nginx (/var/run/php5-fpm-tpnet.sock! = /var/run/php5-fpm-www-data.sock)에서 사용 된 것으로 보이지 않습니다.
cyberx86

1
확실히 PHP 문제입니다. 워드 프레스는 정말 느립니다. 내용이 많을 때 적절한 로딩 시간을 얻기 위해 캐싱 플러그인을 원할 것입니다.
Martin Fjordvald

2
당신은 'localhost에서 ab를 실행하고 4k req / s를 얻을 수있다'고 말했다-어떤 localhost (이전 / 현재)를 말하는가? 이 값이 현재 서버 (TTFB가 높은 서버)에서 얻은 경우 PHP, MySQL 및 웹 서버를 효과적으로 제거했기 때문에 문제가 훨씬 더 흥미로워집니다. TTFB에는 DNS, 왕복 시간 및 처리 시간이 포함됩니다. 긴 TTFB는 일반적으로 처리 때문입니다 (예 : PHP / MySQL). nginx에 대해 ab를 직접 실행하는 요점은 다른 구성 요소를 제거하는 것입니다. 또한 바니시가 올바르게 설정되면 백엔드를 우회하여 매우 높은 req / s를 제공해야합니다.
cyberx86

1
로컬 호스트 테스트가 유효하지 않은 것 같습니다. 실제로 블로그를 검색하지 않았습니다. 페이지 크기 차이는 도메인에서 액세스 할 때 7500 바이트, localhost에서 151 바이트입니다. 가상 호스트가 여러 개있을 수 있으므로 호스트 헤더를 ab로 전달해야합니다. ab -n 1000 -c 100 -H 'Host: mysite.com' http://127.0.0.1/즉, 캐시 된 (Varnish)와 캐시되지 않은 결과의 차이는 문제가 네트워크, DNS 등과 관련이 없으며 예상대로 처리되는 위치를 검증하기에 충분합니다.
cyberx86

답변:


24

첫째, 이것은 진단 접근법만큼 답이 아닙니다.

이것은 결코 포괄적 인 것이 아니며 가까운 곳에서도 시작점 일뿐입니다.

첫 바이트까지의 시간

TTFB (Time to First byte)에는 많은 구성 요소가 있습니다.

  • DNS 조회 : 도메인의 IP 주소 찾기 (개선 가능 : 더 많은 / 분산 / 응답 DNS 서버)
  • 연결 시간 : 서버에 대한 소켓을 열고 연결 협상
  • 대기 중 : 첫 번째 바이트를 전송하기 전에 초기 처리가 필요합니다 (즉, 개선해야 할 위치-동적 내용에 가장 중요합니다).

ApacheBench 출력을 보면 다음 사항도 볼 수 있습니다.

  • 처리 : 이것은 대기 + 컨텐츠의 완전한 전송의 합계입니다 (전송 시간이 수신 된 데이터의 양을 다운로드 할 것으로 예상되는 것보다 상당히 긴 경우 추가 처리 (첫 번째 바이트 수신 후)가 발생합니다 (예 : 페이지는 컨텐츠를 플러시 함)

구성 요소를 제거하기위한 비교

몇 가지 예외가 있지만 문제는 일반적으로 지나치게 복잡하거나 비효율적 인 코드 또는 잘못 구성된 MySQL로 인한 백엔드 처리에 있습니다.

이 문제에 접근하는 좋은 방법은 설정의 다양한 측면을 제거하는 일련의 비교를 통하는 것입니다. 좋은 비교는 문제를 좁히기 위해 가능한 한 일정하게 유지해야합니다. 현재 다음 비교를 제공했습니다.

  1. 기존 서버와 새 서버에서 실행되는 동일한 (복제 된) 사이트 :
    • 차이 : 서버
    • 결과 : 오래된 서버가 빠릅니다. 새로운 서버가 느리다
    • 참고 : 여기에 필요한 것은 사용 된 스택 (Nginx 등)과 하드웨어 측면에서 이들 서버 간의 차이점을 수량화하는 것입니다 (이전 서버는 더 강력한 머신이기 때문에 더 빠른 서버입니까?).
    • 결론 : 코드가 올바른 설정에서 빠르게 실행될 수 있습니다.
  2. 새 서버에서 테스트 사이트와 전체 사이트
    • 차이점 : 컨텐츠, 테마, 플러그인 등
    • 결과 : 테스트 사이트가 빠르며 전체 사이트가 느립니다.
    • 참고 : 이론적 으로이 테스트는 DNS, 네트워크, 심지어 nginx / php / mysql 설정과 같은 설정의 많은 측면을 제거하는 데 도움이되지만 상당히 공정하지는 않습니다.
    • 결론 : 추가 컨텐츠는 성능에 상당한 영향을 미칩니다.

이상적인 테스트는 전체 사이트를 복제 한 다음 한 기사와 관련 주석을 제외한 모든 내용을 삭제하는 것입니다. 이 테스트의 요점은 많은 양의 컨텐츠가 문제인지 또는 설정의 다른 측면 (wordpress 플러그인, 테마 등)이 원인인지 결정적으로 결정하는 것입니다. 동일한 (새로운) 서버에서 동일한 사이트 (동일한 길이 등)를로드하는 것과 동일한 사이트의 성능을 본질적으로 비교하면 전체 사이트 컨텐츠 만 다릅니다 (예 : 일부 플러그인이 그렇지 않을 가능성이 있음) 콘텐츠 증가에 따라 확장 가능).

아무것도 변경하지 않고 다른 비교를 수행 할 수 있습니다.

  • 원격 위치와 로컬에서 테스트-네트워크, 대기 시간, DNS 등이 원인인지 식별하는 데 도움이됩니다.
    • 이미 (어느 정도)이 작업을 수행했으며 대부분 네트워크 문제가 없다고 결론 내 렸습니다.
  • 니스 (예 : 포트 80)와 nginx를 직접 테스트 (포트 8080)-테스트간에 구성을 변경하지 말고 올바른 포트만 사용하십시오. 이것은 니스의 영향을 보여줍니다. Varnish는 캐싱 계층이므로 첫 번째 요청 이후 모든 요청을 매우 빠르게 처리해야합니다. 본질적으로 백엔드와 동적 페이지를 생성하는 데 필요한 처리를 무시하고 캐시 된 사본을 매우 빠르게 제공해야합니다.
    • 이 작업을 수행했지만 (로컬은 아니지만) 니스는 성능에 상당한 긍정적 영향을 미칩니다.

백엔드 튜닝

이 시점에서 문제를 발견했거나 백엔드에 있다고 결론을 내 렸습니다. 그러면 Nginx, PHP 또는 MySQL이 남습니다.

(나는 당신의 병목 현상은 CPU, RAM, 또는 I / O 있는지 알고 항상 편리하다, 여기 언급해야한다 - 사이 sar, top, iostat, vmstat, free., 등이이에 대한 몇 가지 결론에 도달 할 수 있어야한다)

니 진스

Nginx는 요청을 받고 정적 컨텐츠를 제공하거나 요청을 PHP-FPM으로 옮기는 중입니다. 일반적으로 Nginx로 최적화 할 것이 많지 않습니다.

  • 작업자 설정 = # CPU 코어
  • Keepalive 활성화 (10-15의 값이 좋음)
  • 불필요한 로깅 비활성화
  • 필요한 경우 버퍼 크기 늘리기
  • if 문을 피하십시오 (가능한 경우 정규 표현식 대신 정적 이름을 사용하고 불필요한 확장자를 제거하십시오)

테스트 블로그와 복제 된 블로그의 구성이 동일한 것이 이상적이며,이 경우 문제로 Nginx를 효과적으로 제거했습니다.

신청

코드에서 문제 (예 : 느린 플러그인 등)를 식별하려는 경우 느린 로그가 시작됩니다.

  • MySQL 느린 로그 및 PHP-FPM 느린 로그를 사용하여 벤치 마크를 실행하고 느린 결과를 확인하십시오.

MySQL

  • 캐시를 늘리고 mysqltuner.pl 을 실행 하여 좋은 시작점을 얻으십시오.

PHP

  • 불필요한 확장을 비활성화하고
  • register_globals, magic_quotes_ *, expose_php, register_argc_argv, always_populate_raw_post_data 비활성화
  • memory_limit를 늘리십시오
  • open_basedir 및 safe_mode는 성능에 상당한 영향을 주지만 추가적인 방어 계층을 제공 할 수도 있습니다. 이들의 유무에 관계없이 성능에 미치는 영향이 허용 가능한지 확인하십시오.

PHP-FPM

  • 오후 * 값을 조정하십시오-높은 부하를 처리하기 위해 증가

htop 결과가 대량의 CPU를 소비하는 것으로 php-fpm을 표시한다는 점은 주목할 가치가 있으며 문제는 직접 관련이있는 것으로 보입니다.

캐싱

각 병목 현상을 최적화 한 후 캐싱을 시작하십시오.

  • opPC 캐시 (APC)가 이미 있습니다. 테스트 파일과 함께 작동하는지 확인하십시오. 캐시 적중률을 확인하고 가능한 경우 APC 캐시를 디스크 대신 메모리에 저장하십시오.
  • 캐시하도록 코드 설정 (예 : W3TC와 같은 Wordpress 용 플러그인 사용)
  • nginx를 사용하면 FastCGI 캐싱을 설정할 수 있지만 Varnish가 있으므로이를 피하는 것이 가장 좋습니다.
  • Varnish (이미 수행 한)와 같은 캐싱 계층을 설정하고 작동하는지 확인하십시오 (예 : varnishstat 사용, 높은 적중률 달성 )
  • 사이트 구성 요소에 대한 캐싱 추가-예 : 해당되는 경우 MemCached

때로는 응용 프로그램 및 하드웨어의 제한으로 인해 백엔드 사용을 최소화하기 위해 백엔드 성능을 크게 향상시키지 못할 수도 있습니다.

추가 자료


2
그것은 분석 포인트의 환상적인 요약입니다. 의견을 보내 주셔서 감사합니다. 이러한 제안을 모두 사용하여 철저한 테스트를 수행하려고 노력할 것입니다. 이미 말한 것처럼 일부는 이미 명확하고 문제를 마침내 감지 할 수 있는지 확인합니다. 안부 인사, cyberx86.
javipas

에 대해서는 성능에 도움이되지 않는 다른 게시물memory_limit 에서 지적되었습니다 .
forloop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.