programing

XAMPP에 비해 MariaDB Docker 컨테이너에 SQL 쿼리 삽입 속도가 매우 느립니다.

sourcejob 2022. 12. 13. 20:07
반응형

XAMPP에 비해 MariaDB Docker 컨테이너에 SQL 쿼리 삽입 속도가 매우 느립니다.

웹 어플리케이션의 병목현상을 찾고 있었는데 INSERT 쿼리가 다음과 같이 상당히 느리게 실행된다는 것을 알게 되었습니다.

MariaDB [myforum]> insert into tag set tagtext='abc12345',dateline=unix_timestamp(),canonicaltagid=1234;
Query OK, 1 row affected (0.24 sec)

이것은, 를 인스톨 하는 것으로 행해집니다.mysql-client .240ms는 매우 긴 것 같습니다.DNS/DNS를 사용합니다., 를 직접 에서는 "MariaDB"를 사용하여 되었습니다.이 컨테이너에서는 접속이 이루어졌습니다.-h 127.0.0.1:

MariaDB [myforum]> insert into tag set tagtext='abc123',dateline=unix_timestamp(),canonicaltagid=1234;
Query OK, 1 row affected (0.251 sec)

INSERT 쿼리만 적용됩니다.SELECT는 예상대로 꽤 빨랐어요.이상하게도 이것은 MariaDB Docker 설치와 관련이 있는 것 같습니다.로컬 XAMPP 설치 상에 동일한 데이터베이스가 있으며 여기서 동일한 쿼리가 고속입니다.

MariaDB [myforum]> insert into tag set tagtext='abc123',dateline=unix_timestamp(),canonicaltagid=123;
Query OK, 1 row affected (0.00 sec) 

테이블 자체는 vBulletin(오래된 독자적인 포럼 CMS)에서 가져온 것이므로 변경할 수 있는 것은 한정되어 있습니다.

나는 왜 그 간단한 질문들이 매우 느리는지 궁금하다.

이미 시도했다

테스트 테이블의 구조(다른 표에도 영향을 미치는 것 같음)

CREATE TABLE `tag` (
    `tagid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `tagtext` VARCHAR(100) NOT NULL DEFAULT '',
    `dateline` INT(10) UNSIGNED NOT NULL DEFAULT '0',
    `canonicaltagid` INT(10) UNSIGNED NOT NULL DEFAULT '0',
    PRIMARY KEY (`tagid`),
    UNIQUE INDEX `tagtext` (`tagtext`),
    INDEX `canonicaltagid` (`canonicaltagid`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=4112
;

도커 작성 파일

version: '2'
volumes:
  mysql-data:

services:
  # Here is another service that access the db using dns name 'mariadb'

  mariadb:
    container_name: mariadb
    image: mariadb:10.3
    mem_limit: 3GB
    restart: always
    env_file:
      - mariadb.env
    volumes:
      - ../dump.sql:/docker-entrypoint-initdb.d/dump.sql
      - mysql-data:/var/lib/mysql

기본 도커 호스트 서버에 대한 시스템 정보

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic

# docker --version
Docker version 19.03.1, build 74b1e89
# docker-compose --version
docker-compose version 1.24.1, build 4667896b

서버에는 2개의 엔터프라이즈 HDD를 탑재한 소프트웨어 RAID 1이 탑재되어 있어 CPU의 파워와 메모리(32GB)가 충분합니다.또한 현재 다른 애플리케이션에는 사용되지 않으며 사용자의 부하도 없습니다.따라서 부하 문제라는 것을 제외할 수 있습니다.

InnoDB flush (InnoDB 플래시) ★★★★★★★★★★★★★★★★★.innodb_flush_log_at_trx_commit1번으로 하다

MariaDB [myforum]> show variables like '%innodb_flush%';
+--------------------------------+----------+
| Variable_name                  | Value    |
+--------------------------------+----------+
| innodb_flush_log_at_timeout    | 1        |
| innodb_flush_log_at_trx_commit | 1        |
| innodb_flush_method            | O_DIRECT |
| innodb_flush_neighbors         | 1        |
| innodb_flush_sync              | ON       |
| innodb_flushing_avg_loops      | 30       |
+--------------------------------+----------+

값 1은 모든 커밋에 대한 쓰기 및 플러시를 나타냅니다.그럼 이건 오버헤드가 될 수도 있겠네요여기에 2로 변경함으로써 상당한 타협안이 게시되었습니다.이렇게 하면 각 커밋 후에 로그 파일에 쓰이지만,는 1초에 1회만 디스크에 로그를 플러시합니다.

이 기능은 쓰기 성능을 대폭 향상시킵니다.MySQL CLI에는 이전과 같이 최대 300ms가 아닌 0.000초가 표시됩니다.또한 해당 웹 애플리케이션의 HTML 렌더링 시간이 300~700ms에서 최대 90~120ms로 단축되었습니다.

그 결과:최악의 실패의 경우 트랜잭션의 1초가 손실될 수 있습니다.이는 매우 민감한/중요한 데이터(예: 재무 트랜잭션) 및/또는 많은 쓰기 작업에서는 허용되지 않을 수 있습니다.제 경우와 같은 일반적인 웹 케이스에서는 이것이 편리한 수정이라고 생각합니다.이 값을 글로벌하게 변경했습니다.

set global innodb_flush_log_at_trx_commit = 2;

여기에서 얻은 기술 문서를 통해 다음과 같은 사실을 확인할 수 있습니다.

innodb_commit_log_at_trx_commit

Innodb가 MyISAM보다 100배 느리다고 울부짖는다면 이 값을 조정하는 것을 잊어버렸을 것입니다.기본값 1은 특히 배터리 백업 캐시가 없는 경우 각 업데이트 트랜잭션 커밋(또는 트랜잭션 이외의 각 스테이트먼트)에서 디스크에 로그를 플러시해야 함을 의미합니다.많은 애플리케이션, 특히 MyISAM 테이블에서 이동한 애플리케이션은 로그가 디스크에 플러시되지 않고 OS 캐시에만 플러시됨을 의미하는 값 2로 문제가 없습니다.로그는 여전히 매초 디스크에 플러시되므로 보통 1~2초 이상의 업데이트를 손실하지 않습니다.값 0은 조금 빠르지만 MySQL Server가 충돌한 경우에도 트랜잭션이 손실될 수 있기 때문에 보안이 다소 떨어집니다.값 2는 전체 OS 크래시 시에만 데이터 손실을 일으킵니다.

하지만 다른/더 나은 해결책에 대해서는 아직 준비가 되어 있습니다. 게시물에는 기타 팁이 몇 개 기재되어 있습니다만, 그 대부분은 저에게 적합하지 않습니다(서버에는 충분한 자원이나 독자적인 소프트웨어 등이 있습니다).하지만 그들은 비슷한 문제를 가진 다른 사람들을 도울지도 모른다.

언급URL : https://stackoverflow.com/questions/57761895/insert-sql-query-very-slow-in-mariadb-docker-container-compared-to-xampp

반응형