문제

내 MySQL 응용 프로그램은 발생 성능 저하 실행하는 경우 몇 가지 UPDATE, INSERTDELETE 검색어입니다.이 질문에 나는 단지 하나의 특별한 논의 UPDATE, 기 때문에,그것은 충분히 입증하는 문제점:

UPDATE projects SET ring = 5 WHERE id = 1

UPDATE 일반적으로 충분히 빠르,0.2ms 지만,모든 이제 다음(에 충분히 문제가 될) 는 데 몇 초 정도 걸립니다.여기에서 발췌 로그(보 4 선):

 ~ (0.000282) UPDATE `projects` SET `ring` = 5 WHERE `id` = 1
 ~ (0.000214) UPDATE `projects` SET `ring` = 6 WHERE `id` = 1
 ~ (0.000238) UPDATE `projects` SET `ring` = 7 WHERE `id` = 1
 ~ (3.986502) UPDATE `projects` SET `ring` = 8 WHERE `id` = 1
 ~ (0.000186) UPDATE `projects` SET `ring` = 9 WHERE `id` = 1
 ~ (0.000217) UPDATE `projects` SET `ring` = 0 WHERE `id` = 1
 ~ (0.000162) UPDATE `projects` SET `ring` = 1 WHERE `id` = 1

projects 는 InnoDB 테이블을 가진 6 열의 유형 INTVARCHAR,17 행에 인덱스 id.그것으로 발생하는 다른 테이블도 있지만,여기에 초점을 맞추고 있어요 이 하나입니다.면 문제를 해결하기 위해 노력하고,내가 지켜지는 것을 쿼리했다 모든 순차적이,그래서이 지 않는 문제는 잠금.이 UPDATE 위의 컨텍스트에서 실행되는 트랜잭션이 있습니다.기타 에 대한 정보를 서버:

  • VPS4GB RAM was(1GB),12GB 디스크 공간
  • CentoOS5.8was(5.7)
  • MySQL5.5.10(5.0.x)

가"가"비트 위에 즉 그것은 작동하지 않았 전 또는 후 업그레이드합니다.

무엇을 했는데,지금까지 아무 소용:

  • 설정 innodb_flush_log_at_trx_commit 0,1 또는 2
  • 설정 innodb_locks_unsafe_for_binlog on 또는 off
  • 설정 timed_mutexes on 또는 off
  • 변경 innodb_flush_method 에서 기본적으로 O_DSYNCO_DIRECT
  • 증가 innodb_buffer_pool_size 에서 기본적으로 600M 다음 3000M
  • 증가 innodb_log_file_size 에서 기본적으로 128M
  • 컴파일 MySQL 소스에서
  • 실행 SHOW PROCESSLIST, 는 알리 나는 상태입 업데이트"의"
  • 실행 SHOW PROFILE ALL, 는 것을 말한 거의 모든 시간에"업데이트",즉,내에는 단계,그리 많은 시간이 소요된 CPU 사이클과 많은 자발적인 컨텍스트 스위치(30)
  • 모니터링 SHOW STATUS 변화에 대 한 Innodb_buffer_pool_pages_dirty.도 있을 수 있습 사이의 관계는 더러운 페이지 플러시되고 느린 쿼리,하지만 상관관계를 분명하지가 않습니다.

음을 확인하기로 결정했 시스템의 I/O 과 ioping.이 VPS,그래서 을 보고 놀랐 이 결과:

4096 bytes from . (vzfs /dev/vzfs): request=1 time=249.2 ms
4096 bytes from . (vzfs /dev/vzfs): request=2 time=12.3 ms
4096 bytes from . (vzfs /dev/vzfs): request=3 time=110.5 ms
4096 bytes from . (vzfs /dev/vzfs): request=4 time=232.8 ms
4096 bytes from . (vzfs /dev/vzfs): request=5 time=294.4 ms
4096 bytes from . (vzfs /dev/vzfs): request=6 time=704.7 ms
4096 bytes from . (vzfs /dev/vzfs): request=7 time=1115.0 ms
4096 bytes from . (vzfs /dev/vzfs): request=8 time=209.7 ms
4096 bytes from . (vzfs /dev/vzfs): request=9 time=64.2 ms
4096 bytes from . (vzfs /dev/vzfs): request=10 time=396.2 ms

예쁜 엉뚱한,나는 말할 것입니다.

을 말하고 그 모든 것,내가 질문한다:

  1. 할 수 있는 I/O 할 때때로 죽이 MySQL 의 성능은? 나는 항상 생각하는 때,당신은 실행 UPDATE, 스레드를 돌보는 연결이 없었죠 세척 데이터를 디스크 또는 기다릴 넘치;그것은 즉시 반환 및 플러싱에 의해 행해질 것입니다 다른 스레드가 다른 시간에.

  2. 할 수 없는 경우에는 것 디스크 I/O, 거기에 아무것도 나는 다른 사람할 수 있도의 짧은 임대 전용 server?

도움이 되었습니까?

해결책

내가 답하는 내 자신의 질문에 추가적인 데이터는 수집한의 답변에 따라.

내가 사용하는 두 개의 노트북에 의해 연결되어 있는 무선 네트워크입니다.에서 노트북,나 거치된 디렉토리의 노트북을 사용하여 sshfs.그런 다음에서 노트북도 시 MySQL 지정하는 마운트된 디렉토리로 해당 데이터 디렉토리에 있습니다.이 제공 MySQL 매우 느린 I/O 장치입니다.MySQL 로 시작되었다 innodb_flush_log_at_trx_commit = 0.

저는 정의의 3 세트 쿼리,각각의 세트로 업데이트 및 선택 쿼리 반복 10,000 번지 않고,명시적인 트랜잭션이 있습니다.실험었:

  • US1SID:업데이트 선택에서 특정 행일 수 있습니다.같은 행 에서 사용되었 반복 합니다.
  • US1MID:업데이트 선택에서 특정 행일 수 있습니다.행였 다른 하나에서 각각의 iteration.
  • US2MID:업데이트 선택에서의 행 다른 테이블이 있습니다.이 경우에는 테이블 읽으로 선택하지 않은 모든 변경 실험하는 동안.

각 설정 실행을 두 번 사용하는 쉘 스크립트(따라서 시간을 느린에서 그들 보다는 내가 원래 질문),중 하나는 정상적인 조건 하에서 다른 후에 다음 명령을 실행:

tc qdisc replace dev wlan0 root handle 1:0 netem delay 200ms

위의 명령을 추가하는 것을 의미 지연의 200ms 패킷을 전송할 때를 통 the primary network interface allow-hotplug eth0.

첫째,여기에는 평균의 시간 최고 99%가장 빠르게 업데이트 및 선택,그리고 아래 1%업데이트 및 선택합니다.

          |        Delay: 0ms        |       Delay: 200ms       |
          | US1SID | US1MID | US2MID | US1SID | US1MID | US2MID |
| top99%u | 0.0064 | 0.0064 | 0.0064 | 0.0063 | 0.0063 | 0.0063 |
| top99%s | 0.0062 | 0.0063 | 0.0063 | 0.0062 | 0.0062 | 0.0062 |
| bot01%u | 1.1834 | 1.2239 | 0.9561 | 1.9461 | 1.7492 | 1.9731 |
| bot01%s | 0.4600 | 0.5391 | 0.3417 | 1.4424 | 1.1557 | 1.6426 |

같은 명확하고,심지어 정말,정말 가난한 I/O 성능,MySQL 관리 실행 대부분의 쿼리가 정말 빠르다.하지만 문제는 나에게 가장 최악 케이스,그래서 여기에 다른 테이블을 보여주는 10 가장 느린 쿼리를 처리합니다."U"미 었는데,"s"을 선택합니다.

|          Delay: 0ms         |          Delay: 200ms          |
| US1SID  | US1MID  | US2MID  | US1SID   | US1MID   | US2MID   |
| 5.443 u | 5.946 u | 5.315 u | 11.500 u | 10.860 u | 11.424 s |
| 5.581 u | 5.954 s | 5.466 u | 11.649 s | 10.995 u | 11.496 s |
| 5.863 s | 6.291 u | 5.658 u | 12.551 s | 11.020 u | 12.221 s |
| 6.192 u | 6.513 u | 5.685 u | 12.893 s | 11.370 s | 12.599 u |
| 6.560 u | 6.521 u | 5.736 u | 13.526 u | 11.387 u | 12.803 u |
| 6.562 u | 6.555 u | 5.743 u | 13.997 s | 11.497 u | 12.920 u |
| 6.872 u | 6.575 u | 5.869 u | 14.662 u | 12.825 u | 13.625 u |
| 6.887 u | 7.908 u | 5.996 u | 19.953 u | 12.860 u | 13.828 s |
| 6.937 u | 8.100 u | 6.330 u | 20.623 u | 14.015 u | 16.292 u |
| 8.665 u | 8.298 u | 6.893 u | 27.102 u | 22.042 s | 17.131 u |

결론:

  1. 가난한 I/O 성능,실제로 느린 MySQL 이야기입니다.그것은 분명 정확히지만,그것은 일어나지 않습니다.

  2. 느려지고 모두 적용됩 선택 및 업데이트,업데이트와 함께 고통을 더 많은.

  3. 어떤 이유로도,선택에는 테이블이지에 관련된 모든 변경 사항, 그는 최근의 채도가 둔화,로 에서 US2MID 니다.

  4. 으로 테스트 사례에 대한 의해 제안된 mentatkgs,그것은 보인다 다른 업데이트 당신 같은 사람은 돕지 않는 해결 문제입니다.

나나 자 소프트웨어를 허용한 지연 또는 시도를 움직 다른 공급자입니다.임대 전용 서버는 너무 비싸한 이 프로젝트입니다.

모두 감사드립니다.

다른 팁

당신은 VPS 호스팅하는 클라우드에서 실행 될 수 있습니다 문제는 완전히 당신의 통제.

Vpss 를 갖는 변덕의 호스트는 서버를 실행할 수 있습니다.예를 들어,CPU 사이클에서 Rackspace 구름중의 크기에 따라 VPS.더 큰 VPS,더 나은 가능성 앱이 수행됩니다 부드럽습니다.가 있다면 더 큰 VPS 호스트에서 당신을 사용하여,그의 는 거기에 가중치 파열니다.그것은 꽤 힘을 말한다.

시도가 실행되 이에 로컬로 자신의 기?실행되는 경우에 완벽하게 당신의 자신의 시스템 및 성능 보장,당신의 최선의 방법을 이동하는 것입 전용 server.

당신이 VPS 관련 IO 문제입니다.그것은 MySQL 의 잘못이 아닙니다.

는 당신은 만일 당신이 당신을 사용하여 탄성 Block Store Amazon,또는 가능하게 RDS?두 가지 모두 사용하여 원격관,IP 프로토콜을 층을 이야기하여 저장;그들이 가질 수 있습 불쾌한 지연이다.

질문 1)그렇습니다.

을 확인 쓰 2 응용 프로그램:

테스트 case1:이것을 할 것이 매 minuto 몇 시간

UPDATE `projects` SET `ring` = 5 WHERE `id` = 1
UPDATE `projects` SET `ring` = 6 WHERE `id` = 1

테스트 사례 2:이것을 할 것이 분마다 몇 시간

UPDATE `projects` SET `ring` = 7 WHERE `id` = 1
UPDATE `projects` SET `ring` = 8 WHERE `id` = 2

테스트 사례 1 해야한 지연,면서 테스트한 경우 2 지 않아야 합니다.

질문 2)사용 noSQL 에 데이터베이스입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top