Django 채널 + Apache + Docker 성능이 10rq/s로 멈춤

Django 채널 + Apache + Docker 성능이 10rq/s로 멈춤

설정

서버 Ubuntu 20.04 OVH VPS(8vCore, 16Go RAM)의 Docker 컨테이너 내부에 Django 채널을 구성했습니다. django-channel을 실행하기 위해 나는 daphne을 사용했습니다. 버전:

Django==3.1.4
channels==3.0.2
daphne==3.0.1

저는 Daphne-Apache용 이미지, Mysql용 이미지, Redis용 이미지와 함께 Docker-compose를 사용했습니다.

문제

Locust를 사용하여 애플리케이션의 로드 성능을 확인했습니다. 10rq/s 이상이면 서버는HTTP 응답 시간크기가 커지고(> 10초) 애플리케이션을 사용할 수 없게 됩니다.

병목 현상은 어디에 있습니까? 무엇이 성능을 향상시킬 수 있습니까?

추가 정보

  • 참고 1: SQL 쿼리를 페이지당 약 5개 정도로 매우 적은 양으로 줄였습니다.
  • 참고 2: VPS 정보 페이지에서는 CPU, Mem, 대역폭이 전혀 사용되지 않습니다.
  • 참고 3: Apache Alias를 사용하여 정적 파일을 제공하지만 애플리케이션이 오버로드되면 정적 파일도 로드하는 데 시간이 걸립니다.
  • 참고 4: 로드가 너무 많을 때 발생하는 오류ConnectionError(ProtocolError('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')))

나는 다중 프로세스를 사용하여 검색하고 알아 냈습니다.감독자또는쿠버네티스도움이 될 수 있습니다. 하지만 그렇게 되기 전에 모든 것이 정상인지 확인하고 싶습니다.

프로젝트 파일 docker-compose.yml, Routing.py, settings.py를 공유할 수 있지만 현재로서는 도움이 되지 않는 것 같습니다.

답변1

감사합니다. 여기에 명령이 출력됩니다.

A) Docker를 실행하는 루트 우분투로 실행: ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62405
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 62405
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

B) mysql 컨테이너로 실행: SHOW GLOBAL STATUS LIKE '%open%';

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Com_ha_open                | 0     |
| Com_show_open_tables       | 0     |
| Innodb_num_open_files      | 29    |
| Open_files                 | 14    |
| Open_streams               | 0     |
| Open_table_definitions     | 113   |
| Open_tables                | 114   |
| Opened_files               | 149   |
| Opened_table_definitions   | 113   |
| Opened_tables              | 121   |
| Slave_open_temp_tables     | 0     |
| Table_open_cache_hits      | 25    |
| Table_open_cache_misses    | 121   |
| Table_open_cache_overflows | 0     |
+----------------------------+-------+

C) '%open%'과 같은 전역 변수를 표시합니다.

+----------------------------+---------+
| Variable_name              | Value   |
+----------------------------+---------+
| have_openssl               | YES     |
| innodb_open_files          | 2000    |
| open_files_limit           | 1048576 |
| table_open_cache           | 2000    |
| table_open_cache_instances | 16      |
+----------------------------+---------+

D) '%dirty%'와 같은 전역 상태를 표시합니다.

+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| Innodb_buffer_pool_pages_dirty | 0     |
| Innodb_buffer_pool_bytes_dirty | 0     |
+--------------------------------+-------+

E) '가동 시간'과 같은 전역 상태를 표시합니다.

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime        | 544   |
+---------------+-------+

관련 정보