2012-05-05 2 views
12

데이터베이스가 실제 프로덕션 시스템에서 주요 병목 지점이되었음을인지 한 후 간단한 벤치 마크를 구성하여 문제의 최하층에 도달하기로 결정했습니다.InnoDB 병목 현상 : ACID를 완화하여 성능 향상

벤치 마크 : InnoDB 테이블에서 같은 행을 3000 번 증분하는 데 걸리는 시간. 행은 기본 키에 의해 인덱싱되고 업데이트되는 열은 인덱스의 일부가 아닙니다. 필자는 원격 컴퓨터에서 실행되는 20 개의 동시 클라이언트를 사용하여이 3000 개의 업데이트를 수행합니다. 각각의 클라이언트는 DB에 별도로 연결되어 있습니다.

InnoDB, MyISAM 및 MEMORY와 같은 벤치 마크 된 다른 스토리지 엔진이 그 이유를 알고 싶습니다. 나는 InnoDB가 왜 그렇게 열악한지를 이해하기를 희망하고있다.

InnoDB (동시 클라이언트 20 명) : 각 업데이트에는 0.175 초가 소요됩니다. 모든 업데이트는 6.68 초 후에 수행됩니다.

MyISAM (동시 클라이언트 20 명) : 각 업데이트마다 0.003 초가 소요됩니다. 모든 업데이트는 0.85 초 후에 수행됩니다.

메모리 (동시 클라이언트 20 명) : 각 업데이트마다 0.0019 초가 소요됩니다. 모든 업데이트는 0.80 초 후에 수행됩니다.

동시성으로 인해 이러한 동작이 발생할 수 있다고 생각하여 단일 클라이언트가 100 개의 업데이트를 순차적으로 벤치마킹했습니다.

InnoDB : 각 업데이트에는 0.0026 초가 소요됩니다.

MyISAM : 각 업데이트에는 0.0006 초가 필요합니다.

메모리 : 각 업데이트에는 0.0005 초가 필요합니다.

실제 컴퓨터는 대부분 기본 구성 인 Amazon RDS 인스턴스 (http://aws.amazon.com/rds/)입니다.

나는 각 업데이트 후에 InnoDB fsyncs (각 업데이트가 ACID 호환 트랜잭션이기 때문에), MyISAM은 트랜잭션을 지원하지 않기 때문에 fsync를 다음과 같이 가정합니다. MyISAM은 아마도 모든 업데이트를 메모리에서 수행하고 있으며, 정기적으로 디스크로 플러시합니다. 이것은 디스크의 속도가 MEMORY 스토리지 엔진에 접근하는 방식입니다. 그렇다면 트랜잭션 지원을 위해 InnoDB를 사용할 수있는 방법이 있는가하면 구성을 통해 일부 제약 조건을 완화하여 쓰기가 더 오래 지속되도록해야합니다.

또한, 클라이언트 수가 증가함에 따라 InnoDB의 성능을 향상시키는 방법에 대한 제안은 무엇입니까? 다른 스토리지 엔진보다 분명히 확장 성이 있습니다.

업데이트

나는 내가 찾던 정확히 무엇 인 https://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance을 발견했다. innodb-flush-log-at-trx-commit = 2를 설정하면 정전이나 서버 충돌이 발생하는 경우 ACID 제약 조건을 완화 할 수 있습니다 (초당 1 회 디스크에 플러시). 이것은 MyISAM과 비슷한 동작을하지만 InnoDB에서 사용할 수있는 트랜잭션 기능의 이점을 여전히 얻게됩니다.

동일한 벤치 마크를 실행하면 쓰기 성능이 10 배 향상됩니다.

InnoDB (동시 클라이언트 20 명) : 각 업데이트에는 0.017 초가 필요합니다. 모든 업데이트는 0.98s 이후에 수행됩니다.

다른 제안 사항이 있으십니까?

+0

myisam은 설계 상 ACID를 준수하지 않습니다. InnoDB가 있습니다. 조건을 완화하면 더 이상 ACID를 준수하지 않으며 innodb를 사용하지 않을 수도 있습니다. –

+0

당신은 * 거래를 사용하고 있습니다 ... 맞습니까? 트랜잭션이 완료되면 InnoDB *는 ACID의 "D"를 보장하기 위해 하드웨어 플러시를 수행해야합니다 (http://en.wikipedia.org/wiki/ACID#Durability). 빠른 ACID DB조차도 "표준"스핀들 디스크에 대해 약 30-50 * 트랜잭션 */초 **로 제한됩니다. (단, 수천 건의 업데이트 */초를 얻는 것은 어렵지 않습니다. 차이점이 있습니다.) –

+2

ACID를 준수 할 필요는 없습니다. 그러나 트랜잭션 격리와 같은 기능에 대해 약한 형태의 ACI (D 없음)를 원하면 어떻게해야합니까? 우리의 데이터가 너무 민감하지 않기 때문에 Amazon-RDS를 Multi-AZ와 함께 사용하기 때문에 희소 한 충돌과 정전은 우리에게 중요하지 않습니다. – BrainCore

답변

5

나는 https://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance을 찾았는데, 정확히 내가 찾고 있던 것입니다. innodb-flush-log-at-trx-commit = 2를 설정하면 정전이나 서버 충돌이 발생하는 경우 ACID 제약 조건을 완화 할 수 있습니다 (초당 1 회 디스크에 플러시). 이것은 MyISAM과 비슷한 동작을하지만 InnoDB에서 사용할 수있는 트랜잭션 기능의 이점을 여전히 얻게됩니다.

동일한 벤치 마크를 실행하면 쓰기 성능이 10 배 향상됩니다.

InnoDB (20 동시 클라이언트) : 각 업데이트에는 0.017 초가 필요합니다. 모든 업데이트는 0.98s 이후에 수행됩니다.

4

응용 프로그램에서 비슷한 테스트를 수행했으며 명시 적으로 트랜잭션을 열지 않으면 각 단일 SQL 명령이 트랜잭션 내부에서 처리되므로 실행하는 데 시간이 오래 걸리는 것으로 나타났습니다. 비즈니스 로직이 허용하는 경우 여러 SQL 명령을 트랜잭션 블록에 넣을 수 있으므로 전체 ACID 오버 헤드를 줄일 수 있습니다. 우리의 경우이 접근 방식으로 성능이 크게 향상되었습니다.

관련 문제