스케일링 및 튜닝 성능에 대한 실제 경험


54

내가 일하고있는 웹 사이트는 출시 직후에 큰 타격을 입을 것으로 추정된다 . 클라이언트는 하루 정도에 초당 약 2500 개의 조회가 발생할 가능성에 대해 이야기하고 있습니다.

이 적중률이 클라이언트에 대한 낙관론 일 수 있으며 가능한 최대 서버 수를 제외하고 Drupal이 큰 적중률을 지원하도록 구성하는 가장 좋은 방법은 무엇입니까?

drupal.org 인프라 확장 , Drupal 성능 블로그 , Drupal 확장 모범 사례 및 기타 여러 페이지를 읽었 지만 찾고있는 것은 실제로 수행 한 경험, 작동하는 것, 작동하지 않는 것 및 수행 할 작업입니다. 배고 있다.

답변:


47

Markdorison의 대답은 기본적 으로이 문제를 공격하는 데 허용되는 방법입니다. 조금 더 가져 가겠습니다.

당신이있을 때 Pressflow D7, Memcached가와에 대한 D6 또는 드루팔를 들어 니스 모두 잘 작동 함께 사용자 지정 코드로해야합니다 VCL의 파일을. 출발점을 만드는 무료 게임이 있지만 항상 게임을해야합니다.

니스가 최적으로 작동하게하려면 기본값 -s file / path / to / file이 아니라 -s malloc xG로 시작하십시오. 또한 Varnish를 사용하면 가능한 한 Varnish가 정적 항목을 캐시합니다.

웹 서버가 둘 이상인 경우 VCL의 Varnish로 전송 된 헤더에서 ETag를 제거하십시오. 또한 Expires를 제거하고 헤더의 Age 및 Max-age에 의존하므로 브라우저를 사이트로 다시 가져옵니다.

버전 1.5 (2011 년 3 월 3 일 현재)는 Drupal.org의 여전히 가장 빠른 Memcached 모듈 버전입니다. 일반적으로 서버 당 단일 저장소를 사용하여 여러 저장소에 연결하기위한 TCP 트래픽을 줄이기 위해 배포합니다.

"성능"의 캐싱을 외부로 구성하고 올바른 헤더를 Varnish와 같은 캐싱 프록시로 보낼 최대 보존 기간을 설정하십시오.

니스에서 특정 페이지를 제대로 캐시 할 수없는 경우 웹에서 요청을 검사하는 방법을 자세히 설명하는 블로그 게시물을 확인하십시오. 다음은 내가 쓴 글의 예입니다. Varnish 및 Drupal Pressflow가 익명 사용자 페이지 뷰를 캐시하지 못하게하는 이유

MySQL에 대해 InnoDB (또는 XtraDB와 같은 다른 공급자의 다른 이름 중 하나)를 선택하고 모든 테이블을 여기로 이동해야합니다. 그런 다음이 블로그 게시물에서 기본 조정 조언을 확인하십시오. http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

큰 버퍼 풀을 갖는 것이 기본적으로 중요합니다. 사이트를로드 테스트 할 때 느린 쿼리 로그를 켭니다. 처음에는 50msec보다 오래 걸리는 쿼리를 캡처 한 다음 쿼리를 조정하고 대부분의 쿼리가 인덱스를 사용하여 실행되고 상당히 빠르게 실행될 때까지 느린 로그 캡처 시간을 반복적으로 줄이려고합니다.

다른 기본 사항에는 PHP 용 APC 가 포함됩니다 . mod_php 대신 빠른 CGI를 원한다면 좋은 래퍼 스크립트를 구성하여 PHP 인스턴스에서 APC 캐시를 공유하도록 시간을 보내십시오. 또한 APC 캐시가 메모리 맵 파일에 있는지 확인하여 PHP에서 마지막 비트를 압축하십시오.


"mod_php 대신 빠른 CGI를 사용하려면 좋은 래퍼 스크립트를 구성하여 PHP 인스턴스에서 APC 캐시를 공유하는 데 시간을 소비하십시오. 또한 APC 캐시가 메모리 매핑 파일에 있는지 확인하십시오. "PHP에서." : 어떻게 되었습니까? 감사합니다
john

1
그것은 APC 매핑 된 메모리의 경우 컴파일 플래그 ...에 따라 php.net/manual/en/apc.configuration.php
스튜어트 로빈슨

23

Pressflow (Drupal 6을 사용하는 경우), Memcache , Varnish 및 Akamai와 같은 일부 형태의 CDN (Content Distribution Network )으로 시작하는 것이 좋습니다 . 최종 결과는 가능한 한 실제로 사용자가 오리진 서버에 도달하는 사용자 수는 적어야합니다.

익명이 아닌 사용자를 위해 캐시 할 수없는 페이지의 일부 (해당 사용자에 해당하는 것, "환영 인 userX"등)가있는 경우 비동기와 같은 페이지를 채우는 옵션을 탐색 할 수 있습니다. 콜백 또는 엣지 사이드 포함.

캐시되지 않은 버전의 사이트를 볼 수 있어야하는 더 작은 내부 사용자 그룹 (예 : 편집자 그룹)이있는 경우 캐시되지 않은 버전의 사이트를 다른 URL (VPN 뒤에서 보호)에 노출하는 것이 좋습니다 또는 가능하다면 이에 상응하는 것).


Richard : 기쁨입니다. 후속 질문이 있으면 알려주세요.
markdorison

16

하루에 2,500 만 건이 발생합니다. "적중"이란 "게재 된 페이지 수"를 의미하는 경우 하루에 2 억 1 천 2 백만 페이지입니다. 당신이 하루에 2 억 1 천 6 백만 페이지를 가지고 있지 않습니다. 나는이 고객들을 사랑합니다 ...

즉, 원시 트래픽 데이터는 아무 말도하지 않습니다. 익명의 트래픽이지만 트래픽에 로그인 한 경우이 스레드의 조언이 Varnish / CDN에 대해 적절하지만 트래픽에 로그인 한 경우 문제가 있습니다. 그러나 시간과 문제를 해결하기위한 노력의 불경건 한 금액을 지출하기 전에, 당신이 있는지 확인 해야 문제. 초당 2,500 개의 명중, 빙은 그것보다 적습니다.


2
2500 / sec는 고객의 숫자로, 우리 모두가 추측 한 것으로 생각합니다. 그것이 내가 계속해야 할 전부입니다. 실제로 출시가 계획 한 것만 큼 성공하지는 못했고 이상하게도 실제 속도는 초당 약 20 (페이지)에서 약 10 분 동안 최고치를 기록했습니다. 7.32 pages / sec .....
Richard Harrison

7
  • 서버 측

    • 익명 사용자를위한 페이지 캐싱을위한 니스를 설치하십시오.
    • 영구 캐시 시스템 (Memcached, APC, Memcache)을 설치하십시오.
    • 정적 파일 (JavaScript, CSS, 이미지)을 제공하려면 Akamai와 같은 CDN을 사용하십시오.
  • 코드 사이드

    • Pressflow를 사용하면 니스가 익명 사용자에게 캐시 된 페이지를 제공 할 수 있습니다.
    • Drupal의 감시 테이블을 청소하십시오. 워치 독 오류가 기록 될 때마다 웹 서버 및 데이터베이스 서버의 CPU 리소스가 사용됩니다. 또한로드 시간이 크게 증가합니다.
    • 느린 쿼리 로그가 깨끗해질 때까지 정적 및 영구 캐시 전략을 구현하십시오 .
    • 중첩 된 foreach 루프 내에서 발생하는 PHP 오류를 피하십시오.
    • 사용하지 않는 모듈을 제거하십시오.
    • Drupal 코어 블록 및 뷰에 대한 캐싱을 설정하십시오.
  • 데이터 베이스

    • 빠른 검색을 위해 테이블의 인덱스가 올바르게 설정되어 있는지 확인하십시오.
    • 불필요한 레코드를 저장하지 마십시오. 100 개의 노드 데이터베이스는 항상 3 백만 개의 노드 데이터베이스보다 빠르게 액세스됩니다.


4

교통량에 대한 공정한 아이디어가 있다면 패턴을 예측하기가 매우 어렵습니다. 솔루션을로드 테스트하십시오. 다양한 옵션이 있으며 실시간 트래픽이 생길 때까지 예측할 수는 없지만, 가능한 한 많은 부하 테스트를 수행하면 설정에서 트래픽을 처리 할 수 ​​있다는 상당한 신뢰도가 있습니다.

먼저 테스트하지 않으면 세계의 모든 튜닝이 도움이되지 않습니다.

이것은 DC SF에서 이코노미스트가 어떻게했는지에 대한 프레젠테이션입니다. http://sf2010.drupal.org/conference/sessions/performance-testing-economist-online-using-grinder


프레젠테이션에 대한 링크는 진정으로 매우 유용합니다. 감사합니다
Richard Harrison

4

트래픽이 많은 웹 사이트의 경우 여러 서버와로드 밸런서를 사용하거나 단순히 CDN을 사용해야합니다. 또한 웹 서버의로드를 최소화하기 위해 가능한 한 많이 캐시하는 것이 중요합니다.

CDN (Content Delivery Network )을 사용하면 여러 도메인 (도메인 샤딩)에 리소스를 분산시켜 웹 서버의 부하를 줄일 수 있습니다.

CDN을 사용하면 분산 캐싱 및 원격 가속을 지원하고 여러 엔드 포인트로 인해 DDoS 공격 을 완화 할 수 있습니다. 캐시 된 콘텐츠는 악용하기가 더 어렵 기 때문에 보안에 도움이됩니다.

공급자 예 : Fastly , Rackspace , Akamai , Azure, CloudFlare, Amazon, MaxCDN, Verizon.

다음은 몇 가지 제안입니다.

  • CDN에서 정적 구성 요소를 캐시 하려면 쿠키가없는 도메인 을 사용하십시오 (예 : sstatic.net ). 일부 프록시는 쿠키로 요청 된 구성 요소의 캐시를 거부 할 수 있습니다.
  • 캐시를 지운 후 캐시를 예열하십시오 (wget, Cache Warmer , Drush ECL 사용 ).
  • 성능 모니터링 (예 : Drupal과 통합 된 New Relic 또는 Yottaa )을 사용하십시오.
  • 웹 사이트 (예 : Nagios)에 모니터링 도구를 사용하십시오.
  • Varnish 및 Varnish HTTP Accelerator Integration 모듈을 설치 한 다음 구성하십시오 .
  • Varnish + Authcache : Authcache Varnish 구성 파일에 대한예제 VCL을 확인하십시오 .
  • 바니시 앞에서 파운드 또는 NGINX 를 고려하십시오 . 참조 : 왜 파운드 니스의 앞에 굉장합니다 .
  • NGINX는 리버스 프록시 및로드 밸런서로 작동 할 수 있으므로 파운드 및 광택을 대체 할 수 있습니다.
  • "커뮤니티"오픈 소스 버전에서 사용할 수없는 기능을 활용하려면 상용 버전의 Varnish 또는 NGINX를 고려하십시오.
  • 니스와 파운드를 대체하기 위해 하드웨어로드 밸런서 / 캐싱을 고려하십시오 (예 : BIG-IP F5 ).
  • 웹 애플리케이션에서, TTFBab 용 JMeter ,로드 및 스트레스 테스트와 같은 도구를 사용하십시오 .

따라서 사용자 관점의 웹 아키텍처는 다음과 같습니다.

  1. 사용자 (로컬 브라우저 캐싱).
  2. NGINX 또는 Pound + Varnish (로드 밸런서, HTTP 가속기의 리버스 프록시).
  3. 아파치 (웹 서버).
  4. PHP-FPM (PHP FastCGI 프로세스 관리자).
  5. MariaDB (데이터베이스).

Drupal 최적화 제안을 확인하려면 Drupal 성능을 어떻게 개선합니까?


1

다음 두 가지 확장을 활성화하십시오.

  • 젠드 OP 캐시
  • 윈 캐시

당신의 성과는 더 잘 작동합니다.

Microsoft Azure에서 Zend OPcache 및 Wincache를 나뭇 가지로 만들려면 먼저 폴더 이름 ' ini'under ' D:\home\site\'를 작성하십시오. 또한 ' .user.ini'및 ' settings.ini' 2 개의 파일을 작성하십시오.

각 파일에 다음 구성을 추가하십시오.

.user.ini

[PHP]
post_max_size = 32M
memory_limit = 512M
zend.enable_gc = On
upload_max_filesize = 32M
opcache.enable=1

setting.ini

wincache.ocenabled = 1
wincache.ocachesize = 255

또한 PHP_INI_SCAN_DIR 을 사용하여 웹 설정에 앱 설정을 추가하십시오. d:\home\site\ini

PHP_INI_SYSTEM을 변경 한 후 웹앱을 다시 시작하십시오. 나뭇 가지 구성에 대한 자세한 내용을 보려면 Microsoft 설명서 를 확인 하십시오 .

위 설정 후 Drupal (Drupal 8.3) 사이트가 3 초 이내에로드됩니다.


0

DNS 기반 또는 소프트웨어 / 하드웨어로드 밸런싱 솔루션을 활용하여 여러 서버에로드를 재분배하는 것도 검사 할 수 있습니다. 이것은 또한 내결함성에서도 구울 수 있습니다.


이것을 달성하는 방법을 다루지 않으므로 좋은 대답이 아닙니다. OQ에 언급 된 바와 같이, 내가 따르는 스케일링의 실제 경험입니다.
Richard Harrison

결정된 힘이 직장에서 drupal을 실행할 수 있다면 하드웨어 및 구성을 간략하게 설명하는 5 개 이상의 페이지 블로그 게시물을 제공하게되어 기쁩니다.
James Stallings

우수한. 유용한 참조가 될 수 있습니다. 어쨌든 게시 ...
Richard Harrison

개요를 다시 게시 할 권한이 있습니까?
Richard Harrison
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.