>데이터 베이스 >MySQL 튜토리얼 >MySQL 서버의 스레드 수를 확인하는 방법

MySQL 서버의 스레드 수를 확인하는 방법

小云云
小云云원래의
2018-03-26 09:35:181820검색

이 글에서는 주로 MySQL 서버 스레드 수를 확인하는 방법을 소개하며, 필요한 친구들이 참고할 수 있는 MySQL 스레드 수 확인과 관련된 명령, 구성, 매개 변수 및 관련 사용 기술을 분석합니다. 그것이 당신에게 도움이 되기를 바랍니다.

mysql 재시작 명령:


/etc/init.d/mysql restart

MySQL 서버의 정상적이고 원활한 작동을 보장하려면 MySQL 서버의 스레드 수는 합리적인 범위 내에 있어야 합니다. Threads_created는 생성된 스레드 수를 나타냅니다. Threads_created를 보면 MySQL 서버의 프로세스 상태를 볼 수 있습니다.


mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 46 |
| Threads_connected | 2 |
| Threads_created | 570 |
| Threads_running | 1 |
+-------------------+-------+

MySQL 서버 구성 파일에 thread_cache_size를 설정하면 클라이언트 연결이 끊어졌을 때 이 클라이언트를 처리하는 서버의 스레드가 파괴되지 않고 다음 클라이언트에 응답하기 위해 캐시됩니다(캐시 번호가 지정되지 않은 경우). 도달) 상한).

Threads_created는 생성된 스레드 수를 나타냅니다. Threads_created 값이 너무 큰 것으로 확인되면 MySQL 서버가 상대적으로 리소스 집약적인 스레드를 생성했음을 나타냅니다. 구성 파일에서 thread_cache_size 값을 늘릴 수 있습니다. 적절하게 쿼리하고 서버

thread_cache_size 구성:


mysql> show variables like 'thread_cache_size';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| thread_cache_size | 64 |
+-------------------+-------+

예제의 서버는 매우 건강합니다.

연결 수와 관련된 여러 MySQL 매개변수를 분석하세요

MySQL의 변수와 상태는 Oracle의 spfile 및 v$ 테이블과 마찬가지로 관리 및 유지 관리를 위한 강력한 도구입니다.

MySQL은 최대 연결 수와 같은 시스템 변수를 통해 많은 구성 정보를 기록합니다. max_connections:


mysql> show variables like '%connect%';
+--------------------------+-----------------+
| Variable_name | Value |
+--------------------------+-----------------+
| character_set_connection | utf8 |
| collation_connection | utf8_general_ci |
| connect_timeout | 10 |
| init_connect | SET NAMES utf8 |
| max_connect_errors | 10 |
| max_connections | 200 |
| max_user_connections | 0 |
+--------------------------+-----------------+
7 rows in set (0.00 sec)

이 매개변수는 동시에 연결된 클라이언트 수를 나타냅니다. 버전 5.1에서는 기본값이 다음과 같습니다. 151이므로 실제 지원되는 연결 수는 이 값에 1을 더한 152입니다. 연결은 시스템 관리자가 로그인하여 정보를 볼 수 있도록 예약되어 있기 때문입니다. 이 매개변수의 크기는 사용된 플랫폼에서 지원하는 스레드 라이브러리 수(창은 최대 2048개만 지원할 수 있음), 서버 구성(특히 메모리 크기), 각 연결이 차지하는 리소스 등 다양한 요소를 기반으로 고려해야 합니다. (메모리 및 로드) 시스템에서 요구하는 응답 시간 등이 얼마입니까? 일반적으로 Linux 시스템은 아무런 문제 없이 수백 개의 동시성을 지원할 수 있습니다. 이 매개변수는 전역 또는 세션 범위에서 수정할 수 있습니다.


mysql> set global max_connections=151;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%connect%';
+--------------------------+-----------------+
| Variable_name | Value |
+--------------------------+-----------------+
| character_set_connection | utf8 |
| collation_connection | utf8_general_ci |
| connect_timeout | 10 |
| init_connect | SET NAMES utf8 |
| max_connect_errors | 10 |
| max_connections | 151 |
| max_user_connections | 0 |
+--------------------------+-----------------+
7 rows in set (0.00 sec)

그러나 연결 수가 증가하면 많은 연쇄 반응이 발생하므로 실제로는 그에 따른 부정적인 영향을 피해야 한다는 점에 유의해야 합니다. .

먼저 상태 출력을 살펴보겠습니다.


mysql> status
--------------
mysql Ver 14.14 Distrib 5.1.49, for pc-linux-gnu (i686) using readline 5.1
Connection id: 255260
Current database: mysql
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.1.49-log MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 161 days 3 hours 42 min 38 sec
Threads: 14 Questions: 160655492 Slow queries: 71 Opens: 8124 Flush tables: 3 Open tables: 64 Queries per second avg: 11.538
--------------

여기에는 64라는 Open tables 출력이 있습니다. 이는 현재 데이터베이스에 열려 있는 테이블 수가 64개라는 의미입니다. MySQL은 다중 스레드 시스템이고 여러 개의 동시 연결이 동일한 테이블을 열 수 있기 때문에 이 64개 테이블은 실제 64개 테이블이 아닙니다. 이를 방지하려면 이 정보를 저장하기 위해 서로 다른 연결 세션에 독립적인 메모리 공간을 할당해야 합니다. 갈등. 따라서 연결 수가 증가하면 MySQL에 필요한 파일 설명자 수도 늘어납니다. 또한 MyISAM 테이블의 경우 공유 인덱스 파일 설명자도 생성됩니다. Open tables输出时64,这就是说当前数据库打开的表的数量是64个,要注意的是这个64并不是实际的64个表,因为MySQL是多线程的系统,几个不同 的并发连接可能打开同一个表,这就需要为不同的连接session分配独立的内存空间来存储这些信息以避免冲突。因此连接数的增加会导致MySQL需要的 文件描述符数目的增加。另外对于MyISAM表,还会建立一个共享的索引文件描述符。

那么在MySQL数据库层面,有几个系统参数决定了可同时打开的表的数量和要使用的文件描述符,那就是table_open_cache、max_tmp_tables和open_files_limit.


mysql> show variables like 'table_open%';
+------------------+-------+
| Variable_name  | Value |
+------------------+-------+
| table_open_cache | 64  |
+------------------+-------+
1 row in set (0.00 sec)

这 里的table_open_cache 参数是64,这就是说所有的MySQL线程一共能同时打开64个表,我们可以搜集系统的打开表的数量的历史记录和这个参数来对比,决定是否要增加这个参数 的大小。查看当前的打开表的数目的办法一个是用上边提到过的status命令,另外可以直接查询这个系统变量的值:


mysql> show status like 'open%';
+--------------------------+-------+
| Variable_name      | Value |
+--------------------------+-------+
| Open_files        | 3   |
| Open_streams       | 0   |
| Open_table_definitions  | 8   |
| Open_tables       | 8   |
| Opened_files       | 91768 |
| Opened_table_definitions | 0   |
| Opened_tables      | 0   |
+--------------------------+-------+
7 rows in set (0.00 sec)
mysql> show global status like 'open%';
+--------------------------+-------+
| Variable_name      | Value |
+--------------------------+-------+
| Open_files        | 3   |
| Open_streams       | 0   |
| Open_table_definitions  | 10  |
| Open_tables       | 11  |
| Opened_files       | 91791 |
| Opened_table_definitions | 1211 |
| Opened_tables      | 8158 |
+--------------------------+-------+
7 rows in set (0.00 sec)

这 里有Open_tables就是当前打开表的数目,通过flush tables命令可以关闭当前打开的表。而全局范围内查看的Opened_tables是个历史累计值。 这个值如果过大,并且如果没有经常的执行flush tables

따라서 MySQL 데이터베이스 수준에는 동시에 열 수 있는 테이블 수와 사용할 파일 설명자, 즉 table_open_cache, max_tmp_tables 및 open_files_limit를 결정하는 여러 시스템 매개변수가 있습니다.


mysql> show variables like 'max_tmp%';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| max_tmp_tables | 32  |
+----------------+-------+
1 row in set (0.00 sec)

여기에 table_open_cache 매개변수가 있습니다. 이는 64 이며 이는 모든 MySQL 스레드가 동시에 총 64개의 테이블을 열 수 있음을 의미합니다. 시스템의 열린 테이블 수에 대한 기록을 수집하고 이를 이 매개변수와 비교하여 이 매개변수의 크기를 늘릴지 여부를 결정할 수 있습니다. . 현재 열려 있는 테이블 수를 확인하는 한 가지 방법은 위에서 언급한 status 명령을 사용하는 것입니다. 또한 이 시스템 변수의 값을 직접 쿼리할 수도 있습니다.


mysql> show global status like '%tmp%table%';
+-------------------------+-------+
| Variable_name      | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 10478 |
| Created_tmp_tables   | 25860 |
+-------------------------+-------+
2 rows in set (0.00 sec)

여기서 Open_tables는 현재 열려 있는 테이블 번호, 현재 열려 있는 테이블은 플러시 테이블 명령을 통해 닫을 수 있습니다. 전역적으로 표시된 Opened_tables는 기록 누적 값입니다. 이 값이 너무 크고 flush tables 명령이 자주 실행되지 않는 경우 table_open_cache 매개변수의 크기를 늘리는 것을 고려할 수 있습니다.

다음으로 max_tmp_tables 매개변수를 살펴보겠습니다. 🎜🎜🎜🎜
mysql> show variables like 'open_files%';+------------------+-------+| Variable_name  | Value |+------------------+-------+| open_files_limit | 1024 |+------------------+-------+1 row in set (0.00 sec)
mysql> show variables like 'open_files%';
+------------------+-------+
| Variable_name  | Value |
+------------------+-------+
| open_files_limit | 1024 |
+------------------+-------+
1 row in set (0.00 sec)
🎜 이 매개변수는 단일 클라이언트 연결로 열 수 있는 임시 테이블 수를 지정합니다. 현재 열려 있는 임시 테이블 정보 확인: 🎜🎜🎜🎜
mysql> show global status like '%open%file%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files  | 3   |
| Opened_files | 91799 |
+---------------+-------+
2 rows in set (0.01 sec)
🎜 이 두 값을 비교하여 임시 테이블의 생성 위치를 결정할 수도 있습니다. 일반적으로 BLOB 및 TEXT 열의 데이터 볼륨, Group by 및 Distinct. 명령문이 512바이트를 초과하거나, 유니온 중에 선택된 특정 컬럼의 데이터가 512바이트를 초과하는 경우 디스크에 직접 임시 테이블을 생성합니다. 또한, 메모리의 임시 테이블이 커지면 자동으로 디스크로 전송될 수도 있습니다. MySQL에 의한 디스크(tmp_table_size 및 max_heap_table_size 매개변수로 결정) 🎜

继续原来的讨论,增加table_open_cache或 max_tmp_tables 参数的大小后,从操作系统的角度看,mysqld进程需要使用的文件描述符的个数就要相应的增加,这个是由 open_files_limit参数控制的。但是这个参数是OS限制的,所以我们设定的值并不一定总是生效。如果OS限制MySQL不能修改这个值,那 么置为0。如果是专用的MySQL服务器上,这个值一般要设置的尽量大,就是没有报Too many open files错误的最大值,这样就能一劳永逸了。当操作系统无法分配足够的文件描述符的时候,mysqld进程会在错误日志里记录警告信息。


mysql> show variables like 'open_files%';+------------------+-------+| Variable_name  | Value |+------------------+-------+| open_files_limit | 1024 |+------------------+-------+1 row in set (0.00 sec)
mysql> show variables like 'open_files%';
+------------------+-------+
| Variable_name  | Value |
+------------------+-------+
| open_files_limit | 1024 |
+------------------+-------+
1 row in set (0.00 sec)

对应的,有两个状态变量记录了当前和历史的文件打开信息:


mysql> show global status like '%open%file%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files  | 3   |
| Opened_files | 91799 |
+---------------+-------+
2 rows in set (0.01 sec)

MySQL为每个连接分配线程来处理,可以通过threads_connected参数查看当前分配的线程数量:


mysql> show status like '%thread%';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| Delayed_insert_threads | 0 |
| Slow_launch_threads | 0 |
| Threads_cached | 0 |
| Threads_connected | 14 |
| Threads_created | 255570 |
| Threads_running | 2 |
+------------------------+--------+
6 rows in set (0.00 sec)

比较这个threads_connected参数和前面提到的max_connections参数,也可以作为目前的系统负载的参照,决定是否需要修改连接数。

如果查看每个thread的更详细的信息,可以使用processlist命令:


mysql> show processlist;
+--------+-----------+--------------------+----------+-------------+----------+----------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+-----------+--------------------+----------+-------------+----------+----------------------------------------------------------------+------------------+
| 8293 | repl | 192.168.0.33:47208 | NULL | Binlog Dump | 11574424 | Has sent all binlog to slave; waiting for binlog to be updated | NULL |
| 140991 | mogile | 192.168.0.33:41714 | mogilefs | Sleep | 0 | | NULL |
| 140992 | mogile | 192.168.0.33:41715 | mogilefs | Sleep | 3 | | NULL |
| 140993 | mogile | 192.168.0.33:41722 | mogilefs | Sleep | 2 | | NULL |
| 140994 | mogile | 192.168.0.33:41723 | mogilefs | Sleep | 1 | | NULL |
| 140995 | mogile | 192.168.0.33:41724 | mogilefs | Sleep | 3 | | NULL |
| 254914 | mogile | 192.168.0.33:43028 | mogilefs | Sleep | 11074 | | NULL |
| 254915 | mogile | 192.168.0.33:43032 | mogilefs | Sleep | 11091 | | NULL |
| 255144 | mogile | 192.168.0.33:47514 | mogilefs | Sleep | 11090 | | NULL |
| 255157 | mogile | 192.168.0.33:47535 | mogilefs | Sleep | 11087 | | NULL |
| 255162 | mogile | 192.168.0.33:47549 | mogilefs | Sleep | 11074 | | NULL |
| 255260 | root | localhost | mysql | Query | 0 | NULL | show processlist |
| 255352 | maopaodev | 192.168.0.78:55399 | maopaodb | Sleep | 3172 | | NULL |
| 255353 | maopaodev | 192.168.0.78:55400 | NULL | Sleep | 8926 | | NULL |
+--------+-----------+--------------------+----------+-------------+----------+----------------------------------------------------------------+------------------+
14 rows in set (0.00 sec)

执行这个命令需要有Process_priv权限,具体的权限分配信息可以查看mysql.user表。

对于影响系统运行的thread,可以狠一点,用kill connection|query threadid的命令杀死它。

相关推荐:

mysql服务器中主从配置介绍

如何修改MYSQL服务器默认字符集

mysql服务器查询慢原因分析与解决方法小结


위 내용은 MySQL 서버의 스레드 수를 확인하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.