메모리 성능 향상을 위해 Wordpress 리팩토링


63

Wordpress 메모리 소비를 면밀히 살펴 보았습니다. 내 사이트에서 각 페이지 히트마다 20MB의 RAM이 할당되는 것처럼 보입니다. 모든 플러그인을 실행할 수있는 편안한 환경을 준비하기 위해서입니다.

최적화 할 단일 지점이 없으며 대부분의 메모리를 먹는 나쁜 사람이 없습니다. 소비는 모두 많은 많은 PHP 모듈에 퍼져 있습니다.

Wordpress가 메모리에서 환경을 한 번만 초기화 한 다음 적중마다 여러 번 재사용하는 방법은 무엇입니까? 각 사용자가 클릭 할 때마다 PHP가 20MB를 천천히 먹고 싶지는 않습니다. 메모리가 많은 서버에서도 모든 작업을 완료하는 데 몇 초가 걸립니다. 기본적으로 재사용 할 수있는 읽기 전용 메모리 청크가 필요합니다.

또한 ... 왜 20MB입니까? 누구든지 이것에 대한 통찰력을 제공 할 수 있습니까?

편집 : 여기 내 개발 컴퓨터에서 실행되는 Wordpress의 WinCacheGrind 출력입니다 (공유 호스팅보다 훨씬 빠름). 보시다시피 메인 페이지의 HTML을 생성하는 데 약간의 시간이 소요됩니다. 공유 호스팅으로 속도를 늦추고 문제를 해결할 수 있습니다. 대부분의 시간이 걸리는 방법을 선택했습니다. 이것을 최적화하는 방법은 무엇입니까?

편집 : 여기이 환상적인 functions.php 프로파일 링 도구의 쿼리 통계입니다 .

로드 : 12 쿼리-532ms-19.1MB-43 캐시 적중 / 53
쿼리 : 15 쿼리-563ms-19.0MB-72 캐시 적중 / 86
표시 : 21 개의 쿼리-705ms-19.2MB-234 캐시 적중 / 257

편집 : 당신은 당신을 놀라게 보장 뭔가를보고 싶습니까? index.php 끝에 다음 줄을 삽입하십시오.


echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";

현재 게시물의 본문이 메모리에 저장된 횟수를 세려고했습니다. 나는 20 개의 인스턴스를 세었다. 그런 다음 PHP에 참조 횟수가 있다는 것을 알았으므로 사본 수는 3으로 줄었습니다. 2는 WP_Query에 있고, 하나는 객체 캐시에 있습니다. 더 조사 중입니다.

이것이 워드 프레스가 메모리 문제를 대상으로 리팩토링을 필요로하는 이유입니다. 더 이상 복잡한 메모리 사용으로 인해 메모리 소비를 비난 할 수 없습니다. 그것은 단순히 많은 일들을 잘못 합니다.

편집 : 이것을 알아 내려고 하루를 보낸 후, 여기 내 결과가 있습니다.

1) 모든 메모리의 88 %가 요청 또는 포함 또는 포함 _once 유형의 호출에서 발생합니다.

2) php 파일은 대부분의 요청을 처리하는 첫 번째 부분 (놀랍지 않게)에서 발생하며 모든 메모리가 소비되는 곳입니다.

3) 요청하는 동안 실행되는 모든 기능을 구성하는 것은 매우 흥미 롭습니다. 총 12000 건 이상의 통화가 있습니다. 나는 그것을 더 보이게하기 위해 그것들을 흔들 었습니다 (레벨 축은 기본적으로 스택 깊이입니다).

4) 내가 생각할 수있는 유일한 방법은 포함 된 .php 파일의 양을 최소화하는 것입니다. 내가 가져온 파일마다 기능을 분할하면 많은 파일이 최대 한두 번 적중되었음을 알 수 있습니다. 필요하지 않을 때는 건너 뛰는 방법이 필요합니다. 예를 들어, 원격 데이터베이스 백업 플러그인이 전혀 사용되지 않도록로드 및 등록됩니다. 파일 이름으로 분할 된 위의 플롯은 다음과 같습니다.

내 블로그 메모리 풋 프린트를 30 % 이상 줄이게하는 리팩토링에 대해 명성이 높은 현상금을 제공하고 있습니다.

편집 : WP 3.1을 설치했습니다. 이전 버전과의 비교입니다.

파란색은 WP 3.1이고 빨간색은 3.0.4입니다. 새로운 WP는 더 빠르지 만 더 많은 메모리를 사용합니다.

다음은 포함 파일 별 목록입니다.

이를 통해 "All In One SEO pack"이 얼마나 많은 메모리를 사용하는지 알 수 있습니다. 한 가지 방법은 플러그인 기능의 일부만 사용하여 원하는 것을 얻을 수 있다는 것입니다. 또한 내 플러그인은 꽤 나빠 보입니다.

예를 들어 comment.php (내 블로그에 대한 의견을 허용하지 않음) 및 기타 여러 가지에 조건부로드를 시도하고 싶습니다. 더 이상 사용되지 않는 코드를 모두 삭제했습니다. 요청에 따라 전역 테이블 만로드하도록 kses.php를 정리했습니다. l10n (현지화하지 않음)을 단순화하여 함수가 조회없이 문자열을 즉시 반환합니다. 나는 여전히 임의로 설정 한 30 % 마크와는 거리가 멀다.

편집 : 기본 설정 (32MB의 opcode 캐시)으로 APC를 다운로드하여 활성화했습니다. 비교는 다음과 같습니다.

코드 로딩이 엄청나게 빨라지고 메모리에서 공간을 덜 차지한다는 것을 알 수 있습니다 (아마도 원본 소스가 아닌 opcode 만 처리하기 때문에). 그러나 메모리 소비는 여전히 높습니다.


캐시 그라인드 파일 자체를 어딘가에 업로드 할 수 있습니까? 비공개로 유지할 가치가있는 것이 포함되어 있다면 기억하지 않습니다.
Rarst


1
흠, 나는 당신의 결론에 동의합니다-정말로 고칠 것을 요구하는 것은 없습니다. 로컬 테스트 스택 (3.1, MS, Twenty Ten, 테마 단위 테스트 데이터)에 새로운 프로파일을 버리고 1.5를 얻었습니다 (대부분의 차이점은 사용자 정의 메뉴로 인한 것 같습니다-일이 부드럽습니다). 그래서 나는 캐싱 연구를 고칠 아무것도 생각하지 않습니다.
Rarst

@Rarst 도움을 주셔서 대단히 감사합니다. 나는 고칠 물건이 있다고 생각하지만 Wordpress의 아키텍처를 완전히 다른 철학으로 변경해야하며 너무 많은 노력이 필요합니다.
Roman Zenka

답변:


25

문제의 가치가 없습니다. 워드 프레스는 단지 많은 메모리를 소비하지 않습니다. 그것은 많은 기능을 수행하기 때문에 많은 메모리를 소비합니다.

정적 캐시 플러그인으로 결과 (페이지 생성)를 캐시하고 제공하는 것이 훨씬 더 쉽고 효율적입니다. 그렇게하면 대부분의 방문자는 WP 자체를 공격하지 않을 것입니다.


2
이미 캐시를 사용하고 있지만 실제로 동적으로 표시되는 몇 페이지 (예 : 장바구니)가 있습니다. 그리고 별이 올바르게 정렬되지 않으면 사용자는 20 초 동안 기다릴 수 있습니다. 즉, GoDaddy에서 허용되지만 그렇지 않더라도 적어도 ~ 3 초라고 생각합니다. 사람들이 Google에서 익숙한 경험을 제공 할 수는 없습니다.
Roman Zenka

8
@Roman Zenka 특정 성능 요구 사항이있는 경우 WordPress 자체가 마술처럼 빠르고 리소스에 가벼워지기를 기대하는 대신 특정 솔루션을 찾는 것이 좋습니다. 내가 살펴보아야 할 첫 번째 것은 opcode 캐시와 조각 정적 캐싱입니다 ... 그러나 그 전에 도대체 벤치마킹하고 메모리가 어디로 가고 있는지뿐만 아니라 시간이 어디에서 소비되는지 결정해야합니다. 워드 프레스는 자체적으로 병목 현상이 아닌 환경입니다. 병목 현상은 당신이하는 일에 있습니다.
Rarst

@Rarst 나는 실제로 CPU 사용량을 벤치마킹했으며 문제를 일으키는 특정 장소를 손가락으로 가리킬 수 없습니다. 기억과 비슷합니다-그것은 모든 곳에서 퍼져있는 것 같습니다. 그러나 XDebug 프로파일 러와 Cachegrind를 사용하여 벤치마킹이 최적의 방법으로 수행되지 않을 수 있습니다. 더 나은 프로파일 링 기술에 대한 조언에 감사드립니다.
로마 젠카

@Rarst Profiling 스크린 샷이 추가되었습니다.
로마 젠카

4
GoDaddy의 서버 속도가 느려질 수도 있습니다. 그들은 가장 큰 하드웨어를 가지고 있지 않은 것으로 알려져 있으며 " 서버를 업그레이드하는 것보다 텔레비전 광고 비용을 지불합니다 "
Zack

23

이것이 바로 워드 프레스가 심각한 재 작성이 필요한 이유입니다. 더 이상 복잡한 메모리 작업으로 인해 메모리 소비를 비난 할 수 없습니다. 그것은 단순히 일을 잘못합니다.

순진한 결론입니다. 절대로하지 말아야 할 것들을 읽으십시오 ( 1 부) .

그래도 메모리 사용량 플롯에 감사드립니다.

훨씬 나중에 편집 : Autommatic은 prefork 라는 라이브러리를 출시했습니다.이 라이브러리 는 WordPress 코드를 RAM에 한 번만로드하는 것입니다.


사실, 순진합니다. 아마도 "다시 쓰기"대신 "리 팩터"라고 말했을 것입니다. 게시물이 업데이트되었습니다.
Roman Zenka

2
자, 특히 제안 사항 (특히 패치)이 있으면 trac에 게시 할 수 있습니다. core.trac.wordpress.org
scribu

나는 지금 노력하고 있습니다. 메모리에 객체 맵을 플로팅하려고하는데, 얼마나 많이 사용되는지 볼 수 있습니다. 메모리 덤프를 가져 와서 플롯하는 도구가 있습니까?
Roman Zenka

5
@scribu-Joel의 게시물 링크에 +1!
MikeSchinkel

1
WP_Object_Cache는 memcached 구현 등으로 대체 될 수 있습니다.
scribu

17

WordPress 3.2부터는 PHP 5.2가 최소 요구 사항입니다. 우리 벨트 아래에서 코어의 비트가 재구성되기 시작하고 자동 로딩과 함께 클래스를 사용할 수 있다고 생각합니다. 이렇게하면 실제로 필요한 경우가 아니면 코드 덩어리를로드하지 않아도됩니다. 예를 들어 페이지보기에 퍼가기 또는 갤러리가없는 경우 많은 미디어 코드가로드되지 않도록 할 수 있습니다.

그러나 그들이 그 길을 가기로 결정하더라도, 나는 그것이 느리게 진화 할 것으로 기대할 것입니다 (다른 많은 변화가 있었을 때와 마찬가지로). 많은 파일과 코드의 위치를 ​​뒤섞을 필요가 있으며 일부 플러그인의 경우 호환성을 떨어 뜨릴 수 있습니다.

문제의 일부 (실제로 호출 할 수있는 경우)는 이러한 종류의 조건부로드가 없으면 핵심 프레임 워크가 콘텐츠보기를 생성하는 데 필요한 기능을 미리 알 수 없다는 것입니다. 따라서 필요한 경우를 대비 하여 많은 기능을로드해야 합니다.


@Dougal Campbell 나는이 질문에 대해 현상금을 시작했습니다. 현재 적어도 하나의 WordPress 인스턴스를 해킹하여 상대적으로 고통없이 최소 30 %의 메모리 소비 개선을 얻을 수 있는지 확인하십시오. 그것은 미래 발전에 영감을 줄 수 있습니다.
Roman Zenka

조건부로드는 메모리 소비를 잠재적으로 줄이면서 opcode 캐싱 이 관련 될 때 속도를 저하시킵니다 . 우리는 속도를 선호하는 경향이 있습니다.
scribu

자동 로딩에 대한 추가 생각 : stackoverflow.com/questions/4788452/…
scribu

@scribu "조건부로드"라고 말할 때 자동로드 또는 실제로 조건에 따라 코드를로드하는 것에 대해 이야기하고 있습니까? 속도가 얼마나 아파요?
Roman Zenka

1
감사합니다! 내가 말했듯이, WP 코어가 그 경로를 취할지 모르겠다 (요구되는 리팩토링이 너무 극단적 일 수 있음). 그러나 나는 당신이 이것을 분석하는 노력과 당신이 생산 한 그래프에 깊은 감명을 받았습니다. 좋은 일을 계속하십시오!
Dougal Campbell

16

Wordpress가 메모리에서 환경을 한 번만 초기화 한 다음 적중마다 여러 번 재사용하는 방법은 무엇입니까?

이를 opcode 캐싱이라고합니다.

http://en.wikipedia.org/wiki/PHP_accelerator


1
APC에 시도해보고 무슨 일이 일어나는지 보려고합니다. 처음에 그 질문을 할 때, 나는 단순한 opcode 캐싱 이상의 의미를 가졌습니다. 워드 프레스가 구축 한 전체 환경을 재사용하는 것이 었습니다 – 코드 + 데이터. Memcached는 데이터를 더 빨리 얻는 데 도움이되지만 여전히 서버 메모리의 데이터를 복제합니다. 이제 opcode 캐싱이 모든 메모리 소비의 ~ 90 %를 처리 할 것으로 보입니다.
Roman Zenka

일부 실험에 대한 리소스가있는 경우 FastCGI 환경 설정을 시도 할 수도 있습니다. 나는 mod_php와 FastCGI에서 실행하는 것의 비교에 매우 흥미가 있습니다.
Dougal Campbell

5

램 사용량을 크게 줄이지 못할 것입니다. 그러나를 사용하는 경우 대신 mod_php로 전환 할 수 있습니다 mod_fcgid.

mod_php는 약간 느리지 만 이미지 제공, 정적 파일 또는 캐싱과 같이 필요하지 않은 경우에도 PHP를로드합니다. 요청이 많으면 많은 양입니다.

fcgid를 사용하면 이것을 많이 줄일 수 있습니다.

또한, (w3total 캐시 등) 정적 캐시를 사용하여 PHP를 호출 피할 수 모두에서 낮은 램 사용량이 적은 DB 연결 : 정말 큰 장점입니다.


4

하아. 나는 공유 호스팅 계정이 처리 할 수있는 것 이상으로 데이터와 사용량으로 완전히 과부하 할 계획이므로 웹 응용 프로그램을 개발 중이므로 WP에서 빌드하기가 쉽지만 BackPress 에서 다음 과 같이 작업하기로 결정 했습니다. 프레임 워크를 사용하고 특정 유스 케이스에 필요한 것만 빌드하십시오.

따라서 핵심 환경을 WP에있는 수백 개의 PHP 파일에서 20 개로 줄였습니다. 실제로 모든 db, HTTP, 사용자 관리, 형식 및 cron을 활용할 수 있습니다. WordPress에서 좋아하는 기능.

문제는 그것의 많은 일이며, 나는 내 개인적인 용도 이외의 일에 대해서는 내 hackjob을 결코 신뢰하지 않을 것입니다. 전체 WP 환경을 사용하려면 그대로 사용하십시오. 수백 명의 개발자가 수년에 걸쳐 미세 조정했기 때문에 좋은 것입니다. 여기에있는 모든 사람들이 말했듯이, 핵심을 해킹 할 때보 다 더 나은 호스팅 계획을 찾고 캐싱 기술을 연구하면 훨씬 더 멀리 갈 수 있습니다.


1
WP가 오랫동안 미세 조정되었다는 데 동의합니다. 그러나 특정 플러그인 조합을 사용하여 크 래피 호스팅에서 작동하도록 미세 조정되지 않았다고 생각합니다. 나는 그것을 얼마나 멀리 밀 수 있는지 궁금합니다. 변경 사항이 코어로 변경되지 않더라도 필요한 경우 코어를 해킹하는 문서화 된 방법을 사용하는 것이 좋습니다.
로마 젠카

3

예, 워드 프레스는 모든 것을 먼저로드 한 다음 요청한 작업을 수행합니다. RAM을 사용하여 파일을 넣을 수있는 가상 풀을 만들 수 있다는 것을 기억할 수 있습니다. 전체 WordPress를 메모리에 넣는 아이디어를 가졌으며 (<10MB) 속도를 높여야하는 많은 I / O를 절약 할 수 있습니다. 그러나 나는 그것을 시도 할 수있는 기회를 얻지 못했으며 또한 그런 것을 추구하는 데 능숙하지 않습니다. 그러나 시도해 볼 가치가 있습니다.


그리고 처리가 전혀 수행되지 않도록 Rarst에 정적 캐시 플러그인을 사용하는 데 동의합니다. 그러나 그것은 좋은 역학으로도 사용될 수 있습니다. :)
Ashfame

나는 그 아이디어를 좋아한다. 나는이 문제가 I / O 대기 시간으로 인해 얼마나 많은지, PHP가 천천히 데이터를 씹는 이유는 확실하지 않습니다. 말하는 방법을 알고 있습니까?
Roman Zenka

내 머리 속에 아이디어가 유감입니다. 데이터가 일반적으로 하드 디스크에서 블록으로 읽히는 것처럼 보일 수있는 성능에 영향을 미치지 않으므로 필요한 다른 많은 데이터가 이미 페치되었을 수 있습니다. 확실하지 않습니다.
Ashfame

3

몇 가지 기본 제안 :

  1. 캐싱을위한 w3 총 캐시 플러그인 ..
  2. memcache를 설치하고 활성화하십시오 .w3 총 캐시 설정에서 활성화하십시오 (opcode 캐시도 좋은 옵션이지만 w3 총 캐시 플러그인과 잘 어울리지 않습니다)
  3. 테마 파일에서 링크를 지시하는 쿼리를 최소화합니다.
  4. 사용하지 않는 추가 플러그인을 모두 비활성화하고 제거하십시오.
  5. 데이터베이스를 최적화하십시오.

나는 매일 엄청난 트래픽으로 잘 알려진 워드 프레스 사이트를 운영하고 있습니다.

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