网络参数优化：`back_log`, `table_open_cache`, `open_files_limit`

admin
Thu, 05 Jun 2025 06:51:15 +0000
Mysql, back, log, open

好嘞！ 各位观众老爷们，大家好！ 今天咱们不聊八卦，不谈人生，就来唠唠嗑，说说数据库里那些“默默奉献”的网络参数，尤其是MySQL里那几个经常被我们忽视，但却能直接影响数据库性能的小家伙：back_log，table_open_cache，和 open_files_limit。 咱们的目标是：把这些听起来有点枯燥的参数，讲得像听相声一样有趣，让大家在欢声笑语中，轻松掌握它们的用法和优化技巧。 准备好了吗？ 咱们开车啦！ 一、 故事的开始：数据库服务器的“门卫”——back_log 想象一下，你经营着一家超级火爆的餐厅，门口永远排着长队。 这些排队的人，就是试图连接到你的数据库服务器的客户端。 back_log 参数，就像你餐厅门口的“门卫”，负责管理这些排队的人。 它的作用： back_log 参数定义了TCP连接队列的大小，也就是在MySQL服务器忙于处理其他连接时，可以等待连接请求的最大数量。 简单来说，就是你的“门卫”最多能让多少人排队等候入场。 如果“门卫”太小会怎样？ 如果你的餐厅门口只能排10个人，而实际上有100个人想来吃饭，那剩下的90个人就只能灰溜溜地走了。 在 …

继续阅读“网络参数优化：`back_log`, `table_open_cache`, `open_files_limit`”

The post 网络参数优化：`back_log`, `table_open_cache`, `open_files_limit` first appeared on 智猿学院-前后端，数据库，人工智能，云计算等领域前沿技术讲座.

好嘞！ 各位观众老爷们，大家好！ 今天咱们不聊八卦，不谈人生，就来唠唠嗑，说说数据库里那些“默默奉献”的网络参数，尤其是MySQL里那几个经常被我们忽视，但却能直接影响数据库性能的小家伙：back_log，table_open_cache，和 open_files_limit。

咱们的目标是：把这些听起来有点枯燥的参数，讲得像听相声一样有趣，让大家在欢声笑语中，轻松掌握它们的用法和优化技巧。 准备好了吗？ 咱们开车啦！

一、 故事的开始：数据库服务器的“门卫”——back_log

想象一下，你经营着一家超级火爆的餐厅，门口永远排着长队。 这些排队的人，就是试图连接到你的数据库服务器的客户端。 back_log 参数，就像你餐厅门口的“门卫”，负责管理这些排队的人。

它的作用： back_log 参数定义了TCP连接队列的大小，也就是在MySQL服务器忙于处理其他连接时，可以等待连接请求的最大数量。 简单来说，就是你的“门卫”最多能让多少人排队等候入场。

如果“门卫”太小会怎样？ 如果你的餐厅门口只能排10个人，而实际上有100个人想来吃饭，那剩下的90个人就只能灰溜溜地走了。 在数据库的世界里，这意味着连接请求会被拒绝，客户端会收到“Connection refused”的错误。 这就像你心仪的女神/男神给你发消息，结果你手机没电关机了，直接错过了表白的机会，多么痛的领悟啊！

那是不是越大越好呢？ 理论上来说，back_log越大，能容纳的等待连接请求就越多，但实际上，操作系统对这个值也有自己的限制。 而且，back_log设置过大，也会占用更多的系统资源。 就像你的餐厅门口排了1000个人，虽然看起来很壮观，但他们也占用了大量的空间，可能会影响周围的交通，甚至引起投诉。

如何设置合适的back_log？ 这个没有绝对的标准答案，需要根据你的服务器的实际情况和负载来调整。 一般来说，可以通过以下方式来判断是否需要调整back_log：

查看错误日志： 如果你的MySQL错误日志中频繁出现“Connection refused”的错误，那就说明back_log可能太小了。

使用netstat命令： 可以使用netstat -s | grep "listen"命令来查看是否有连接溢出的情况。 如果listen drops的值不为0，就说明有连接被拒绝了。

优化建议：

1. 逐步调整： 不要一下子把back_log设置得很大，而是逐步增加，观察服务器的性能变化。

2. 关注操作系统限制： 不同的操作系统对back_log的最大值有不同的限制，需要注意。 在Linux系统中，可以通过修改/proc/sys/net/core/somaxconn文件来调整系统级别的back_log限制。

3. 配合其他参数： back_log的优化需要和其他参数配合使用，例如tcp_syncookies等。

二、 数据库的“缓存小能手”——table_open_cache

接下来，我们来认识一下table_open_cache。 这个参数就像数据库服务器的“缓存小能手”，负责缓存已经打开的表定义信息。

它的作用： 每次查询数据表时，MySQL都需要先打开这张表，读取它的定义信息（例如字段类型、索引等）。 table_open_cache参数定义了MySQL可以缓存多少张表的定义信息。 这样，下次再查询同一张表时，MySQL就可以直接从缓存中读取，而不需要重新打开这张表，从而提高查询效率。

如果“缓存”太小会怎样？ 如果你的“缓存”只能存储10张表的定义信息，而你的应用程序需要频繁查询100张表，那么MySQL就需要不断地打开和关闭表，这会消耗大量的系统资源，导致查询速度变慢。 这就像你每次都要跑到图书馆去查资料，查完一本就得还回去，下次再查同一本还得再跑一趟，效率简直低到爆！

那是不是越大越好呢？ 当然不是！ “缓存”越大，占用的内存就越多。 如果你的服务器内存有限，table_open_cache设置过大，可能会导致内存不足，影响服务器的稳定性。 这就像你的书架虽然很大，但是书太多了，把你的房间都堆满了，你连走路的地方都没有了，生活质量直线下降！

如何设置合适的table_open_cache？ 这个也需要根据你的数据库的实际情况来调整。 一般来说，可以通过以下方式来判断是否需要调整table_open_cache：

查看Opened_tables状态变量： 可以使用SHOW GLOBAL STATUS LIKE 'Opened_tables';命令来查看已经打开的表的数量。 如果Opened_tables的值增长很快，就说明table_open_cache可能太小了。

查看open_files_limit参数： table_open_cache的值不能超过open_files_limit的值，否则MySQL会报错。

优化建议：

1. 逐步调整： 不要一下子把table_open_cache设置得很大，而是逐步增加，观察服务器的性能变化。

2. 监控Opened_tables： 定期监控Opened_tables的值，根据实际情况调整table_open_cache。

3. 配合table_definition_cache： table_definition_cache参数也和表的定义信息有关，可以根据实际情况调整。

三、 数据库的“文件管家”——open_files_limit

最后，我们来聊聊open_files_limit。 这个参数就像数据库服务器的“文件管家”，负责管理MySQL可以同时打开的文件数量。

它的作用： MySQL需要打开各种各样的文件，例如表文件、索引文件、日志文件等等。 open_files_limit参数定义了MySQL可以同时打开的最大文件数量。

如果“文件管家”太小会怎样？ 如果你的“文件管家”只能管理100个文件，而MySQL需要同时打开200个文件，那么MySQL就会报错，导致查询失败。 这就像你的电脑只能同时打开10个窗口，而你非要打开20个窗口，结果电脑直接卡死，让你欲哭无泪！

那是不是越大越好呢？ 理论上来说，open_files_limit越大，MySQL可以同时打开的文件就越多，但实际上，操作系统对这个值也有自己的限制。 而且，open_files_limit设置过大，也会占用更多的系统资源。 这就像你的办公桌虽然很大，但是堆满了文件，你根本找不到你需要的文件，工作效率反而降低了！

如何设置合适的open_files_limit？ 这个也需要根据你的数据库的实际情况来调整。 一般来说，可以通过以下方式来判断是否需要调整open_files_limit：

查看错误日志： 如果你的MySQL错误日志中出现“Too many open files”的错误，那就说明open_files_limit太小了。

使用ulimit命令： 可以使用ulimit -n命令来查看当前用户的最大文件打开数量。 MySQL的open_files_limit的值不能超过这个值。

优化建议：

1. 修改操作系统限制： 如果ulimit -n的值太小，可以通过修改/etc/security/limits.conf文件来提高操作系统级别的限制。

2. 逐步调整： 不要一下子把open_files_limit设置得很大，而是逐步增加，观察服务器的性能变化。

3. 配合table_open_cache： open_files_limit的值应该大于table_open_cache的值，否则MySQL会报错。

四、 总结：参数优化，贵在“平衡”

好了，各位观众老爷们，今天的相声就说到这里了。 咱们总结一下：

back_log： 管理连接请求的“门卫”，设置过小会导致连接被拒绝，设置过大会占用系统资源。

table_open_cache： 缓存表定义的“缓存小能手”，设置过小会导致频繁打开和关闭表，设置过大会占用内存。

open_files_limit： 管理文件打开数量的“文件管家”，设置过小会导致无法打开足够的文件，设置过大会占用系统资源。

记住，参数优化，贵在“平衡”。 不要盲目追求越大越好，而是要根据你的数据库的实际情况，找到一个合适的平衡点。 这就像做菜一样，盐放多了会咸，糖放多了会甜，只有恰到好处，才能做出美味佳肴！

最后，给大家留个思考题： 如果你的数据库服务器的CPU利用率很高，但是磁盘IO不高，你觉得可能是什么原因？ 欢迎在评论区留言，咱们一起交流学习！ 下期再见！