Extra Form
PHP PHP 7.3
CMS WordPress

안녕하세요.

 

NGINX UBUNTU PHP-FPM MARIADB를 이용해 웹사이트를 운영하고 있습니다.

 

구글링을 통해 수많은 가이드를 보면서 따라해보았습니다만, 늘 램에 관해 이해가 잘 안됩니다.

 

 

예를들면 PHP, Nginx , Mariadb 등 각각의 프로세스가 점유하는 메모리가 있고, 캐쉬(Opcache, Fastcgi)마다도 각각 램을 설정할 수 있는데요..

 

1) 만약 램이 2기가라고 가정했을때 이 모든 램을 더해서 2기가 이내로 설정해야되는건가요?

 

2) 예를들어 PHP에서의 memory_limit = 128m opcache의 opcache.memory_consumption = 128mb, 이라고 하면 php에서 256mb를 차지하는건가요?

 

3) Mysql에서는 수 많은 캐쉬 설정 (tmp_table_size, query_cache_size, innodb...) 있는데, 이걸 어떻게 나눠줘야되는건지요? mysqltuner로 돌려보았지만 계속해서 증가 > 시키라는 조언만 나오더군요.. 

 

4) 메모리는 어떤 프로세스에 많이 지정해주는게 속도에 가장 영향을 많이 미치나요? php에 줘야되는지 db에 줘야되는지 모르겠습니다.

 

답변 기다리겠습니다. 감사합니다.

  • profile

    1. 네.

     

    2. (PHP 프로세스 갯수 × memory_limit) + opcache.memory_consumption + 기본메모리 수십MB 정도입니다. PHP 프로세스 갯수는 PHP-FPM pool의 pm.max_children 설정에 좌우됩니다. 비교적 최근 버전의 우분투 기준으로 아마 기본값이 5일 거예요. 이 때 PHP에서 사용할 수 있는 RAM의 이론적 최대치는 (5 × 128) + 128 + 수십MB = 800MB 정도가 됩니다. 물론 이론상 최대치이기 때문에 5명이 동시에 큰 사진을 업로드하고 썸네일을 생성하는 짓거리를 하지 않는다면 실제로 그렇게 많이 사용하지는 않겠지만, 어느 날 갑자기 서버 터질 수도 있어요.

     

    3. MariaDB는 각종 버퍼와 캐시가 워낙 많아서 쉽게 계산하기 어렵지만, 대략 innodb_buffer_pool_size + 500~1000MB 정도 차지한다고 생각하시면 됩니다. mysqltuner가 자꾸 더 늘리라고 한다면 더 늘려야지요. 더 늘리기에는 서버에 RAM이 부족하겠다 싶으면 RAM을 늘려야지요. DB에 RAM을 100기가 넘게 주는 서버도 있습니다;;;

     

    4. MariaDB에 충분한 RAM을 할당해주는 것이 가장 중요합니다. 그렇다고 PHP 쪽을 줄일 수는 없습니다. 128MB 밑으로 내려가면 XE나 워드프레스 등 대부분의 CMS가 정상 작동하지 않고, pm.max_children을 줄이면 동시에 처리할 수 있는 접속자 수가 깎여 버리고, opcache도 성능과 직결되어 있으니까요.

     

    그래서 서버를 제대로 쓰려면 최소 4기가의 RAM이 필요하다고 하는 거예요.

  • profile ?
    기진곰님. 안녕하세요

    친절한 답변 너무 감사합니다. 덕분에 오랫동안 헷깔렸던 부분이 많이 정리되었습니다.

    마지막 4번에 DB에 램을 할당하는게 중요하다고 말씀해 주셨는데, 조금 더 구체적으로 알려주실 수 있으신가요?

    예를들면 tmp_table_size, query_cache_size, innodb 등을 골고루 전체적으로 증가시켜야 되는건가요?

    아니면 tmp_table_size, query_cache_size 보다 innodb_buffer_pool_size를 크게 잡는것 처럼 한쪽에 몰아주는게 좋을까요?

    또한 스왑 파일은 메모리 계산에서 전혀 고려하지 않아도 될까요?

    정말 감사합니다.
  • ? profile

    각각의 용도가 다르니 매뉴얼을 한번 읽어보시면 좋습니다.

    tmp_table_size, max_heap_table_size는 쿼리 결과를 정렬하거나 필터링하는 데 사용됩니다. XE 기준으로 성능에 악영향을 주지 않으려면 각각 64M 정도 주는 것을 권장합니다.

    쿼리 캐시는 성능에 도움이 될 수도 있지만, query_cache_size가 너무 크면 캐시 락이 자주 걸려서 오히려 성능이 떨어집니다. 32M 이하를 권장합니다. query_cache_limit은 아주 작게 (32~64K) 설정하세요.

    나머지는 innodb_buffer_pool_size에 몰빵해야 합니다. 이 녀석은 모든 InnoDB 테이블의 용량을 다 합친 것과 비슷하거나 더 큰 것이 이상적이지만, 여의치 않으면 절반이라도 되는 것이 좋습니다. 오랫동안 많은 데이터를 쌓아온 커뮤니티 사이트는 현재 접속자수가 많지 않더라도 이 점 때문에 innodb_buffer_pool_size를 10G 이상 설정하기도 합니다. 진짜 큰 사이트는 100G 단위로 넘어갑니다. 이게 모자라면 서버에 RAM을 계속 갖다붙여야 합니다;;;

  • profile ?
    버퍼풀사이즈를 100GB나 설정하다니 와우!
  • profile ?

    기진곰님 정말 감사합니다.

    기진곰의 설명을 바탕으로 구글링을 해서 읽어보니 대략 어떤식으로 해야되는지 감이 잡히네요.

    마지막으로 혹시 PHP나 Mariadb의 설정은 배수 64 - 128 - 256 - 512m 이런식으로만 지정해야되나요?

    아니면 1300m 이런식으로 지정해도 아무런 상관이 없을까요?

    친절하게 설명해주셔서 정말 감사합니다.

  • ? profile

    꼭 2배씩 늘어나지 않아도 상관없습니다. mysqltuner도 가끔 애매한 값을 추천하곤 하지요. 이런거 많이 하는 사람들에게는 32M, 64M, 128M, 256M가 10, 20, 30, 40처럼 자연스럽게 나오는 숫자이다 보니... 1000은 왠지 좀 모자란 숫자인 것 같아서 꼭 1024를 쓰게 되고... ㅋㅋㅋ