[bash]
max_connections = 100
[/bash]
max-connections 整个MySQL允许的最大连接数,这个参数主要影响的是整个MySQL应用的并发处理能力,当系统中实际需要的连接数大于max-connections时,由于MySQL的设置限制,应用中必然会产生连接请求的的等待,从而限制了相应的并发量。这个参数默认是100,最大是16384。一般来说500到800左右是一个比较适合的参考值。[sql]
mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
[/sql]
网络连接交互相关的参数
max-user-connections每个用户允许的最大连接数net-buffer-length网络包传输中,传输消息之前的 net buffer初始化大小
该参数主要影响的是网络传输的效率,由于该参数所设置的只是消息缓冲区的初始化大小,所以造成的影响主要是当每次的消息都很大时,MySQL 总是需要多次申请扩展缓冲区的大小。default 16MB,一般来说可以满足大多数场景,如果查询返回的数据量非常小,每次网络传输量都很少,而且系统内存又比较紧缺,可以适当将该值调整到 8MB。max-allowed-packet网络传输中,一次消息传输量的最大值
该参数与 net-buffer-length 相对应,只不过是net buffer的最大值,当消息传输量大于net-buffer-length的设置时,MySQL 会自动增大net buffer的大小,直到缓冲区大小达到 max-allowed-packet 所设置的值。系统默认值为 1MB,最大值是1GB,必须设定为1024的倍数,单位为字节。back-log在 MySQL 的连接请求等待队列中允许存放的最大连接请求数
连接请求等待队列,实际上是指当某一时刻客户端的连接请求数量过大,MySQL 主线程没办法及时给每一个新的连接请求分配(或创建)连接线程时,还没有分配到连接线程的所有请求将存放到一个等待队列中,这个队列就是MySQL 的连接请求队列。当系统存在瞬时的大量连接请求时,则应该注意 back-log 的设置时。default: 50,最大可以设置为 65535。当增大 back-log 参数的设置时,同时还需注意 OS 级别对网络监听队列的限制,因为如果 OS 的网络监听设置小于 MySQL 的back-log设置,加大back-log设置是没有意义的。
连接线程优化
MySQL中,为了尽可能提高 客户端请求创建连接 这个过程的性能,实现了一个Thread Cache池,将空闲的连接线程存放其中,而不是完成请求后就销毁。这样,当有新的连接请求时,MySQL首先会检查Thread Cache 池中是否存在空闲连接线程,如果存在则取出来直接使用,如果没有空闲连接线程,才创建新的连接线程。
thread-cache-sizeThread Cache池中应该存放的连接线程数
如果应用程序使用的是短连接,Thread Cache 池的功效是最明显的。因为在短连接的数据库应用中...thread-stack每个连接线程被创建时,MySQL 给它分配的内存大小
线程相关的系统变量
[sql]
mysql> SHOW VARIABLES LIKE 'thread%';
+-------------------+---------------------------+
| Variable_name | Value |
+-------------------+---------------------------+
| thread_cache_size | 8 |
| thread_handling | one-thread-per-connection |
| thread_stack | 196608 |
+-------------------+---------------------------+
3 rows in set (0.00 sec)
[/sql]
系统被连接的次数及当前系统中连接线程的状态值
[sql]
mysql> SHOW STATUS LIKE 'connections';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections | 45 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'thread%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 1 |
| Threads_connected | 1 |
| Threads_created | 2 |
| Threads_running | 1 |
+-------------------+-------+
4 rows in set (0.00 sec)
[/sql]
通过上面的命令,可看出,系统设置了Thread Cache 池中最多将缓存8个连接线程,每个连接创建之初,系统分配 192KB 的内存堆栈给它。系统启动到目前共接收到客户端的连接 40 次,共创建了2个连接线程,当前有1个连接线程处于和客户端连接的状态,有1个连接的线程处于active状态,即正在处理客户端提交的请求。而在Thread Cache缓冲池共缓冲了1个连接线程。
根据Connections 和 Threads_created 这两个系统状态值,还可以计算出系统新建连接的Thread Cache 命中率,即:
[text]
Thread-cache-hit = (Connections - Threads-created) / Connections; (>=90%)
[/text]
系统不能连接数据库,可看两个数据:
A. max_connections
B. threads_connected
当 threads_connected = max_connections 时,就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝。
因为创建和销毁数据库连接,都会消耗系统资源。而且为了避免在同一时间同时打开过多的连接线程,一般都需要用到数据库连接池技术。但数据库连接池技术,并不能避免程序错误导致连接资源消耗殆尽,这种情况通常发生在程序未能及时释放连接资源或其他原因造成连接资源不能释放。
该错误有个简便的检查办法,刷新页面时,不断监视 threads_connected 的变化。 当 threads_connected 值不断增加以至达到 max_connections,如果采用数据库连接池技术,threads_connected 增长到数据库连接池的最大连接线程数时,就不再增长了。
没有评论 :
发表评论