대규모 사이트를위한 메모리 절약 캐시 삭제 전략?


30

Drupal 7 사이트 중 하나에는 수천 개의 필드, 많은 콘텐츠 유형, 25 회 이상의 조회수 및 수백 개의 프로필 유형이 있습니다. 이 때문에 엔터티 필드 정보 (http://drupal.org/node/1040790)를 더 잘 캐시하는 핵심 패치와 하나의 HUGE가 아닌 디스플레이로 뷰를 더 잘 캐시하는 -dev 버전의 Views를 사용하고 있습니다. 모든 뷰 데이터가 포함 된 뷰 캐시 행).

이로 인해 사이트의 대부분의 페이지가 160MB 이상이 아니라 20-30MB의 RAM을로드하는 데 도움이되었습니다 (10MB 이상의 필드 및 뷰에 대해 cache_ * 테이블 행을 가져 오는 대신 패치는 cache_ * 데이터를 훨씬 더 효율적으로 유지하는 데 도움이 됨).

그러나 캐시 재 구축에 시간이 오래 걸린다는 문제가 있습니다. 보통 1-2 분 이상. 그리고이 시간 동안 Drupal은 단순히 페이지를로드하지 않습니다 (읽고 자하는 캐시가 아직 빌드되지 않았기 때문에 다른 요청은 기다려야 함).

트래픽이 적은주기에서는 큰 문제가 아닙니다. 백 명 정도의 사용자는 페이지가로드되기 전에 1 분 정도 기다려야합니다. 그러나 트래픽이 많은주기 동안 Apache 서버는 40 개 이상의 CPU로드로 열이 나기 시작하고 모든 작업자 스레드가 대기하고 메모리를 최대로 사용하여 스왑을 발생시키기 때문에 메모리가 빠르게 채워집니다. 일종의 죽음의 나선입니다. httpd를 다시 시작하면 문제가 해결되지만 상황이 정상으로 회복 되려면 5-10 분이 걸립니다.

내 목표는 캐시 공간을 확보하여 사이트를 무릎으로 가져 가지 않도록하는 것입니다. 예를 들어 admin_menu의 개별 캐시 지우기 기능 (예 : "CSS 및 JS", "메뉴", "테마 레지스트리"등)을 사용하면 "Page and else"옵션을 누를 때까지 문제가 해결됩니다. 이때 뷰 캐시가 재설정되고 (캐싱해야하는 뷰 수가 많은 CPU 및 데이터베이스 집약적 인 작업) 필드 정보 캐시가 재설정 될 때 (이 사이트의 CPU 및 데이터베이스 집약도)입니다.

그래서 ... 내 질문 / 아이디어 :

  • drush 및 / 또는 다른 셸 스크립팅을 사용하면 "한 번에 모든 캐시를 폭파하고 깨끗한 재 구축을 희망"하는 것보다 더 지능적인 방식으로 캐시를 지울 수 있습니까?
  • 캐시 지우기가 진행되는 동안 http 요청을 차단하여 아파치가 많은 캐시 스탬프 요청으로 인해 막히지 않을 수 있습니까?
  • Drupal / normal httpd 요청 외부에서 캐시를 지울 수 있다면 캐시 지우기 작업에 대해 더 높은 PHP memory_limit를 설정하고 범용 memory_limit를 취소 할 수 있습니다 (개별 httpd 스레드가 캐시를 지워야하는 경우 현재 256MB로 설정). ...).

기본적으로 : UI에서 버튼을 클릭하거나 사용하는 것 외에도 Drupal을 사용하여 모든 캐시를 지우는 지능적이고 우아한 방법이 drush cc all있습니까?

[ 명확한 편집 : 내가 가진 주요 문제는 캐시 재 구축 입니다. (a) 시간이 걸리고 (b) 재 구축이 완료 될 때까지 다른 모든 요청을 차단합니다. 교통량이 많은 시간에 재건이 치명적이지 않도록하는 방법을 찾고 싶습니다.]


2
흥미로운 질문입니다. 캐싱을 비활성화하면 사이트 성능이 적절합니까? 캐싱을 사용하지 않고 실행할 수 있도록 Apache / PHP / MySQL을 최적화 했습니까? 분명히, 나는 당신의 시스템을 보지 못했지만 apc.stat = 0을 설정하고 APC에 충분한 메모리를 확보하면 디스크 사용을 줄이는 데 도움이됩니다. mysqltuner.pl을 사용하면 MySQL이 병목 상태인지 여부도 알 수 있습니다. 그런 다음 캐싱 및 조정을 켤 수 있습니다 (일부 DB 사용이 증가하므로 MySQL 매개 변수를 조정해야 할 수도 있음).
mpdonadio

Redis (memcache와 유사)를 사용하여 뷰 캐시 테이블을 메모리에 유지합니다. 로드 시간이 크게 향상되었습니다. 안정된 릴리스에서 "디스플레이 별 캐시보기"기능을 기대하고 있습니다.
uwe

@MPD-캐싱을 비활성화하면 전체 사이트가 빠르게 종료됩니다. 일반적으로 100-500 명의 인증 된 사용자이며 사이트의 일부 섹션은 상당히 무겁습니다. 나에게 가장 큰 문제는 캐시 읽기 (Memcached, Redis 및 APC 사용자 캐시를 실험 한 것)가 아니라 캐시 재 구축입니다. CPU가 매우 강렬합니다.
geerlingguy

새 캐시를 재 구축하는 동안 오래된 캐시 데이터를 사용하는 것이 이상적입니다. 이 올바른지?
mikeytown2

@ mikeytown2-맞습니다. 이상적입니다.
geerlingguy

답변:


9

UI에서 버튼을 클릭하거나 drush cc all을 사용하는 것 외에도 Drupal을 사용하여 모든 캐시를 지울 수있는 지능적이고 우아한 방법이 있습니까?

캐시 액션 모듈은 않습니다. 규칙에 따라 다릅니다. 예를 들어, "x"유형의 노드가 추가되거나 업데이트 될 때 특정보기를 지우도록 규칙을 설정할 수 있습니다. 자세한 내용 은 문서 를 확인하십시오.

또한 캐시 우아한 모듈을 살펴보십시오 . 아직 시도하지 않았지만 흥미로워 보입니다.


이미 drush cc [type]특정 캐시 지우기 (캐시 작업과 유사)에 사용하고 있지만 캐시를보다 정상적으로 지우는 방법을 찾고 다른 httpd 스레드가 Apache 서버를 죽이지 않는지 확인하는 데 더 관심이 있습니다.
geerlingguy

1
cc가 모든 뷰 캐시를 지우는 것처럼 보입니다. 캐시 조치를 사용하면 특정보기 또는 표시를 지울 수 있습니다. views dev 버전에 버그가있을 수 있습니다. 그렇지 않으면 캐시를 다시 빌드하는 데 1-2 분이 걸리지 않습니다. 뷰 7.x-3.5를 사용할 때도 같은 문제가 있습니까? drupal.org/project/cache_graceful도 살펴보십시오. 아직 시도하지는 않았지만 흥미로워 보입니다
uwe

Views dev는 캐시 읽기 성능을 높이기 위해보기 표시를 자체 캐시 행으로 나눕니다. 이는 뷰가 캐시를 구축하는 데 5 배 더 많은 시간을 소비한다는 것을 의미합니다 (그러나 캐시를 많이 읽을 때 메모리 사용량을 줄이는 데 도움이됩니다).
geerlingguy

Cache Graceful에 대한 정보를 원래 답변에 추가 할 수 있습니까? 특정 모듈이 약간 도움이되기 때문에 받아 들일 것입니다 (그러나 문제를 완전히 해결하지는 못합니다). 필자는 실제로 문제를 해결하기 위해 더 적은 수의 필드와 엔터티 유형을 사용하기 위해 사이트를 약간 재구성해야한다고 생각합니다.
geerlingguy

승인. cache_graceful에 대한 귀하의 경험에 대해 듣고 싶습니다. 어떤 부분이 해결되지 않았습니까?
uwe

2

주요 문제는 MySQL을 사용하여 캐시 데이터를 저장한다는 것입니다.로드가 많은 사이트의 경우 매우 효과적이지 않습니다.

대신 Memcache 를 사용하는 것이 좋습니다. 이렇게하면 캐시 시스템의 성능이 크게 향상되고 다음과 같은 2 가지 이점이 있습니다.

  1. Memcache는 MySQL보다 읽기 및 쓰기 작업이 훨씬 빠릅니다. 모든 캐시 작업 (및 전체 캐시 재 구축)이 더 빠르게 작동합니다.
  2. 캐시 데이터는 더 이상 DB에 저장되지 않기 때문에 캐시를 지우면 다른 MySQL 쿼리는 차단되지 않습니다.

다음은 Drupal 7 의 Memcache 구성 예입니다 .


나는 memcached와 APC를 여러 가지 방법으로 사용했으며, 캐시 읽기를 크게 지원하지만 실제로 가장 큰 문제는 실제 재구성입니다. (매우 느리거나 긴) 재 구축 프로세스 동안 웹 서버가 캐시를 스탬핑하는 동안 데이터베이스는 거의 아무것도하지 않습니다.
geerlingguy

APC와 Memcached는 다른 것을 만듭니다. Memcached의 올바른 구성이 도움이 될 것이라고 생각합니다. BTW, 귀하의 사이트가 대부분 익명 사용자가 방문하는 경우, Varnish를 사용할 수 있습니다. 이 경우 Varnish는 자체 캐시 시스템을 사용하며 익명 요청에 대해서는 Apache가 실행되지 않습니다.
유진 피델 린

이 사이트에는 거의 100 %의 인증 된 트래픽이 있습니다. 그렇지 않으면 Varnish를 사용하는 것이 좋습니다. 이 시점에서 Cache Graceful 모듈을 살펴볼 수 있습니다.
geerlingguy

0

drush 및 / 또는 다른 셸 스크립팅을 사용하면 "한 번에 모든 캐시를 폭파하고 깨끗한 재 구축을 희망"하는 것보다 더 지능적인 방식으로 캐시를 지울 수 있습니까?

모든 캐시를 폭파하지 않으려면 다음 drush cc type_of_cache을 사용 하여 특정 캐시 를 지우거나 직접 정의하십시오.

또는 모든 캐시와 유사한 테이블을 수동으로 지 웁니다 (예 :

echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v 

memcached (Bash 구문)를 사용하는 경우 다음을 시도하십시오.

pgrep memcached && echo flush_all > /dev/tcp/127.0.0.1/11211

캐시 지우기가 진행되는 동안 http 요청을 차단하여 아파치가 많은 캐시 스탬프 요청으로 인해 막히지 않을 수 있습니까?

drush -y vset maintenance_mode 1사람들이 사이트에 액세스하지 못하게하려면 유지 관리 모드 ( )를 활성화 하십시오. 또는 다른 곳으로 리디렉션하도록 프론트 엔드를 구성하십시오 (예 : Varnish, Apache에서 리디렉션 또는 변경 .htaccess).

Drupal / normal httpd 요청 이외의 캐시를 지울 수 있다면 memory_limit캐시 지우기 작업을 위해 더 높은 PHP 를 설정하고 범용을 해제 memory_limit할 수 있습니다 (개별 httpd 스레드가 캐시를 지워야하는 경우 현재 256MB로 설정). ).

캐시를 지우는 데는 더 많은 메모리가 필요하지 않지만 캐시를 비운 후에는 다시 작성하는 데 더 많은 시간이 걸립니다. cron을 실행하거나 페이지를 열어서 언제든지 캐시를 예열 할 수 있습니다. 예 :

time php -n -d memory_limit=-1 time $(which drush) cc registry
PHP_OPTIONS='-d memory_limit="2G"' drush cron
php -d memory_limit=1G ./scripts/drupal.sh http://localhost/

캐시 지우기 프로세스를 추가로 가속화 할 수있는 처리 -n를 무시하도록 지정하십시오 php.ini.


-1

잠재적으로 금전적 비용이 발생할 수 있지만 Varnish와 같은 캐싱 서버 설정을 사용할 수 있습니다. 단점은 사용자가 더 현명하지 않고 프로덕션 서버에서 캐시가 비워지는 동안 Varnish가 사이트를 제공한다는 것입니다.

단점 : 프로덕션 서버의 가동 중지 시간 (초 / 분) 대 VCL 시간 제한 설정에 따라 해당 시간 동안 광택이 업데이트 될 수 있으며 광택 503 오류 화면이 표시됩니다.

그러나 Redis 또는 Memcache와 함께이 방법이 도움이 될 수 있습니다.


이 질문은 내부 Drupal 캐시에만 해당됩니다. Drupal의 캐시를 재 구축하는 데는 시간이 오래 걸리고 Drupal 외부 / 외부에서 추가 캐싱 계층은 실제 캐시 데이터를 재 구축하는 데 큰 도움이되지 않습니다 (웹 서버가 캐시하는 동안 웹 서버가 약간 보유해야하는 일부 트래픽을 오프로드하는 것 외에도) 재건됩니다).
geerlingguy

이 경우 Zend OpCache가 잘 작동한다는 것을 알았습니다. :-)
mulderjoe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.