【问题标题】:Cannot change the mysql connection limit无法更改mysql连接限制
【发布时间】:2012-11-20 17:54:39
【问题描述】:

我在 linux 机器上只运行 8 核和 16GB 内存的 mysql。所有连接都来自同一网络中另一台机器上的 Web 服务器,该机器使用 codeigniter 运行 php。

我无法在 mysql 上获得超过 150 个连接。

我的 my.cnf 是:

[mysqld]
user=mysql
port            = 3306
socket          = /tmp/mysql.sock
datadir = /usr/local/mysql/var/
skip-external-locking
max_connections=500
max_user_connections=500
open-files-limit = 500
key_buffer_size = 2048M
max_allowed_packet = 32M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 128M
thread_cache_size = 250
table_definition_cache = 1024

query_cache_size = 32M
query_cache_limit = 32M
table_cache=1024
max_heap_table_size=1024M
key_buffer=2048M
wait_timeout=60
thread_concurrency = 16
long_query_time = 1
tmp_table_size=256M

show status 返回 max_connections 和 max_user_connections 为 500。

由于 mysql 说连接限制是 500,我认为 PHP、apache 或 codeigniter 中还有其他设置限制了对 mysql 的请求,但我找不到任何设置。我已经在谷歌上搜索了几天试图找到答案,但没有任何运气。

是否对上述任何软件设置了限制?如有必要,我会发布配置。

谢谢。

【问题讨论】:

  • 我认为我被限制在 150 个客户端,因为我使用的是名为 Siege 的负载测试软件。但是当我使用带有 200 个并发连接的 ab 时,也会发生同样的事情。我只有 150 个 mysql 连接。但奇怪的是,其他使用浏览器的客户端可以建立超过 150 个的 mysql 连接。所以我对这篇文章的问题可能是“如何使用负载测试软件测试超过 150 个并发连接的 Web 应用程序负载,例如ab?"

标签: mysql connection limit


【解决方案1】:

在 httpd.conf 中检查 Apache 工作进程的最大数量(ServerLimit 和 MaxClients)。假设每个工作人员的连接数固定,您可能会最大限度地利用工作人员的数量,因此不会请求新的 MySQL 连接。

【讨论】:

  • 这是我的 worker.c 配置来自 httpd.conf ` ServerLimit 60 StartServers 2 MaxClients 1500 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 1000 ` 对不起,不要知道如何格式化回复。我不认为我在这里的设置将 mysql 连接限制为 150。
  • @user1839694 如果您只能拥有 60 个工作进程,请根据您在脚本中创建的数量计算可能拥有的连接数。如果创建了 2 或 3 个连接,那么您的最大 SQL 连接数约为 150 个。尝试创建一个单独的 php 页面,该页面循环并创建与 DB 的连接 200 次而不关闭任何...在每个页面之间睡眠 500 毫秒。当你到达 2 分钟时,检查你的 db 连接数 mysql 连接数是否超过 150?
  • 我的 ThreadsPerChild 是 25。60 个工人 X 25 = 1500,这是 MaxClients。我会尝试创建建议的脚本。
  • @user1839694 啊,你没有使用 MPM worker,prefork。我的错。
  • 我不知道如何在单个脚本上创建到同一个 mysql 的多个连接,所以我创建了一个保持连接打开并使用 siege(Web 应用程序负载测试软件)与 200同时连接。我最终只有 150 个连接。好吧,准确地说是153。 1 个用于提示,2 个来自其他脚本的永久连接。也许我只是认为我得到了 150 个连接,因为我正在使用 siege 对我的应用程序进行负载测试,并且它有局限性,因为它是 1 个客户端通过多个连接访问 apache。
【解决方案2】:

抱歉,刚刚在 Google 上找到了这个,但你的配置是 foobar

max_connections=500
open-files-limit = 500
table_open_cache = 512
table_definition_cache = 1024

打开文件限制:500 #;不好!

table_open_cache: 512... * 每个表 2+ 个打开文件 = 最少使用 1024 个打开文件

max_connections: 500 每个打开的连接都会启动一个新的文件句柄来缓冲。

您的 mysql 将打开大约 130 个表以启动(核心表),这使您只有 240 个文件句柄可以在数据查询和连接之间共享。对于表查询的每个连接,都会消耗 3 个以上的文件句柄(连接、数据表、索引文件)。在您获得 150 个连接之前,这会使您的打开文件最大化。对于这种数据库使用情况,open-files-limit 需要从 >2048 开始。

更多帮助:

show global status like '%open%';
show global status like '%onnect%';

亲自查看实际使用了多少文件/连接。某些操作系统 (Windows XP) 硬限制文件/网络连接。尝试谷歌搜索“mysql 'YOUR-OS' 150 connections”,看看这是否是限制因素。

【讨论】:

  • 下一个必须清除的障碍是,当您设置 open-files-limit=2048 并检查打开的文件时,却发现您仍然限制为 150,因为 mysql 忽略了设置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2018-10-15
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
相关资源
最近更新 更多