我们的 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 PROCESSLIST
MySQL 中的命令检查是否有许多查询处于“锁定”状态。