mysql 服务器因连接数过多而挂断

mysql 服务器因连接数过多而挂断

我们的 mysql 服务器由于打开的连接数过多而导致严重过载。在我的例子中,大多数连接都处于打开状态,我甚至无法终止它们。这是我无法理解的。连接如下所示:

    | 13927 | slimdiz1_dstream | localhost | slimdiz1_docstream         | Query      | 20   | closing tables       | SELECT autoload FROM wp_options WHERE option_name = '_site_transient_theme_roots'                    |
| 13934 | okanaga1_db1     | localhost | okanaga1_db1               | Query      | 5    | Opening tables       | INSERT INTO sessions VALUES('e442db394d16e7ac5d2154ae3e1ccbe4', '1306059991', 'a:5:{s:11:"LoginCooki |
| 13935 | mkca1_wrdp5      | localhost | mkca1_wrdp5                | Query      | 7    | Opening tables       | SELECT * FROM wp_users WHERE ID = 1 ..

与 Web 服务器的连接数(最大为 150):

    ps -e | grep httpd | wc -l
109

有效内存:

    free -mto
             total       used       free     shared    buffers     cached
Mem:          7974       5565       2409          0        153       1373
Swap:         2047         31       2016
Total:       10022       5597       4425

MySQL服务器版本和配置文件:

    [mysqld]

safe-show-database

set-variable = max_connections=450
set-variable = interactive_timeout=150
set-variable = connect_timeout=35
set-variable = wait_timeout=70
set-variable = max_user_connections=30

set-variable = key_buffer=48M
set-variable = read_buffer=5M
set-variable = join_buffer=1M
set-variable = record_buffer=1M
set-variable = sort_buffer=2M

set-variable = table_cache=1028
set-variable = thread_cache=128

set-variable = query_cache_limit=1M
set-variable = query_cache_size=1024M
set-variable = query_cache_type=1
set-variable = thread_concurrency=4
set-variable = max_allowed_packet=5M

set-variable = delayed_insert_limit=80
set-variable = delayed_insert_timeout=200
set-variable = delayed_queue_size=700

set-variable = flush_time=300


mysql  Ver 14.12 Distrib 5.0.91,
Linux 2.6.38.3-grsec 

当负载过高时,我使用以下命令终止 mysql 进程:

killall -9 httpd php
mysqladmin pr | awk {'print$2'} | xargs -i mysqladmin kill {};

您能否帮助我理解为什么尽管服务器上有可用资源,但进程却在打开状态下挂起?

PS:我在 Google 上搜索了这个问题,阅读了一些文章,也在论坛上搜索过,但没有成功。

提前感谢您的任何帮助。

更新。top -c 输出:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
    24738 mysql     20   0 1480m 310m 4612 S  70  13   7:46.33 /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql

答案1

SQL 请求在服务器上“堆积”的一个常见可能原因是MySQL/MyISAM 的穷人版“锁定机制”,甚至配不上它的名字。如果您有一个长时间运行的 SELECT 查询,则任何写入由长时间运行的 SELECT 使用/锁定的表的 INSERT、UPDATE 或 DELETE 查询都会导致“拥塞”,并停止使用任何受影响表的任何连续查询。

当您再次遇到此情况时,使用SHOW FULL PROCESSLISTMySQL 中的命令检查是否有许多查询处于“锁定”状态。

相关内容