programing

Mysql 성능 불량

javaba 2022. 9. 16. 22:24
반응형

Mysql 성능 불량

이 간단한 테이블이 있습니다.

CREATE TABLE `user_did_something` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `something_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `active` int(1) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Indexes for table `user_did something`
ALTER TABLE `user_did_something`
  ADD PRIMARY KEY (`id`);

삽입하려고 하면

INSERT INTO user_did_something (something_id, user_id) VALUES (1,11)

실행 시간은 ~70ms입니다.

다른 기계에서 동일한 구조를 사용할 경우 실행 시간은 약 3ms입니다.

추가 정보:

  • 10.0.28-MariaDB-0ubuntu0.16.04

  • 테이블에 행이 없습니다.

  • 에만 해당됩니다.id그건 기본입니다.

디버깅 방법을 모르겠어요.온라인으로 읽고 다시 시작해도 결과는 똑같아

mysql 서버를 컴퓨터에 재설치하지 않고 디버깅할 수 있는 방법을 찾고 있습니다.

mysql 서버를 컴퓨터에 재설치하지 않고 디버깅할 수 있는 방법을 찾고 있습니다.

질문의 이 부분에 대해 답변해 드리겠습니다.따라서 프로세스의 밑면을 엿보고 어떤 기능을 하는지 확인해야 합니다.재컴파일, 재인스톨, 재기동등이 필요 없습니다.또, 개봉시에 동봉되어 있는 트레이스에 의해서 제한되는 일도 없습니다.

DTrace를 사용할 수 있는 좋은 기회입니다!프로세스(및 그 외)를 감시할 수 있습니다.

DTrace는 적어도 Solaris, Mac OS X* 및 FreeBSD에서 사용할 수 있으며 Linux용 포트가 있다고 들었습니다.그렇지 않으면 다른 유틸리티를 사용하여 유사한 정보를 추적할 수 있습니다(BPF 트레이스는 최근에 Linux 4.9-rc1에 통합되었습니다).

*Mac OS X 사용자는 시스템 무결성 보호에서 제외함으로써 DTrace 실행을 명시적으로 허용해야 합니다.

하실 수 .mysqld함수의 입력과 반환을 실시간으로 수행합니다.

dtrace -p $(pgrep -x mysqld) -F -n 'pid$target:mysqld::entry{} pid$target:mysqld::return{}'

출력의 예로서…InnoDB는 아이돌 상태에서도 꽤 수다스럽다.

2  -> sync_arr_wake_threads_if_sema_free    
6  -> os_event_reset                        
2    -> os_mutex_enter                      
6  <- os_event_reset                        
2    <- os_mutex_enter                      
6  -> pfs_mutex_exit_func                   
6  <- pfs_mutex_exit_func                   
2    -> os_mutex_exit                       
6  -> os_event_reset                        
2    <- os_mutex_exit                       
6  <- os_event_reset                        

MySQL 디스패처에 들어오는 쿼리를 볼 수 있습니다!

dtrace -p $(pgrep -x mysqld) -F -n 'pid$target:mysqld:*dispatch_command*:entry{printf("Query: %s\n", copyinstr(arg2));}'

샘플 출력:

CPU FUNCTION                                 
0  -> dispatch_command(enum_server_command, THD*, char*, unsigned int) Query: SHOW VARIABLES LIKE 'pid_file'

특정 쿼리가 실행되는 동안 발생하는 함수 호출을 수신하는 것도 DTrace의 능력 범위 내에 있다고 생각합니다.예를 들어, 다음과 같이 할 수 있습니다.mysqld:*dispatch_command*:entry가 몇 기준에 하는 경우 를 init하여 "를 만듭니다.pid$target:mysqld::entry|return해당 변수가 정의되어 있는 동안만 인쇄합니다.대응하는 것mysqld:*dispatch_command*:exit그 변수를 정의하지 못할 수도 있습니다.물론 작업이 별도의 스레드에서 수행될 것으로 예상되는 경우 전역 변수를 사용할 수도 있습니다.

위의 구체적인 예를 쓰지 못해 죄송합니다.MySQL은 호스가 달려있고 DTrace 책은 사무실에 있습니다.

DTraceToolkit의 저자인 Brendan Gregg는 프로세스에서 페이지 장애 발생 여부, 읽기 및 쓰기 크기, 작성 중인 시스템 등을 감시하기 위한 한 줄짜리 스크립트를 포함하여 오류 프로세스를 감시하는 데 도움이 될 수 있는 많은 샘플 스크립트를 제공합니다.하지만 DTrace를 더 자세히 배우면 한 줄보다 훨씬 더 잘할 수 있습니다.


여기서 제시한 스크립트는 Ben Rockwood의 기사 "DTrace를 사용한 MySQL 실시간 검사"에 제시된 스크립트를 기반으로 합니다.읽으려면 무료 등록이 필요합니다.

Brendan Gregg의 기사에서 이 툴에 대해 알게 되었고, Brendan의 DTrace 책에서 DTrace에 대해 더 많이 알게 되었습니다.토끼굴의 깊이를 보고 싶다면 이 책을 적극 추천한다.

이전에도 같은 문제가 발생하여 MySQL을 재시작하여 문제를 해결하였습니다.다음을 권장합니다.

Ubuntu에 방화벽이 있는 경우 선택합니다.

캐시 크기를 확인하고 캐시 크기가 켜져 있는지 확인합니다.

SHOW VARIABLES LIKE have_query_cache;
SHOW VARIABLES LIKE query_cache_size;

실행 중인 프로세스 및 속도 저하 확인:

SHOW PROCESSLIST;

x$statement_analysis를 통해 비용이 더 많이 드는 쿼리를 확인합니다.

SELECT * FROM sys.`x$statement_analysis`

글로벌 상태를 확인합니다.당신은 그곳에서 매우 유용한 정보를 찾을 수 있다.Threads_connected:

SHOW GLOBAL STATUS

언급URL : https://stackoverflow.com/questions/41772997/mysql-bad-performance

반응형