热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MySQL如何计算打开文件数_MySQL

MySQL如何计算打开文件数
每打开一个MyISAM表,就需要使用2个文件描述符,咱们来验证一下MySQL如何计算打开文件数。


  一、试验

  从手册的"6.4.8. How MySQL Opens and Closes Tables"可以了解到,每打开一个MyISAM表,就需要使用2个文件描述符,咱们来验证一下。

  1. 重启mysqld

  /etc/init.d/mysql restart

  2. 看看打开了几个文件

  lsof | grep /home/mysql
  ...
  mysqld 24349 mysql 5u unix 0x000001041e8de040 4244009 /home/mysql/mysql.sock
  mysqld 24349 mysql 6u REG 8,33 2048 30425188 /home/mysql/mysql/host.MYI
  mysqld 24349 mysql 7u REG 8,33 0 30425189 /home/mysql/mysql/host.MYD
  mysqld 24349 mysql 8u REG 8,33 2048 30425153 /home/mysql/mysql/user.MYI
  mysqld 24349 mysql 9u REG 8,33 892 30425155 /home/mysql/mysql/user.MYD
  mysqld 24349 mysql 10u REG 8,33 5120 30425126 /home/mysql/mysql/db.MYI
  mysqld 24349 mysql 11u REG 8,33 3080 30425148 /home/mysql/mysql/db.MYD
  mysqld 24349 mysql 12u REG 8,33 4096 30425154 /home/mysql/mysql/tables_priv.MYI
  mysqld 24349 mysql 13u REG 8,33 0 30425157 /home/mysql/mysql/tables_priv.MYD
  mysqld 24349 mysql 14u REG 8,33 4096 30425143 /home/mysql/mysql/columns_priv.MYI
  mysqld 24349 mysql 15u REG 8,33 0 30425156 /home/mysql/mysql/columns_priv.MYD
  mysqld 24349 mysql 16u REG 8,33 4096 30425127 /home/mysql/mysql/procs_priv.MYI
  mysqld 24349 mysql 17u REG 8,33 0 30425136 /home/mysql/mysql/procs_priv.MYD
  mysqld 24349 mysql 18u REG 8,33 1024 30425173 /home/mysql/mysql/servers.MYI
  mysqld 24349 mysql 19u REG 8,33 0 30425174 /home/mysql/mysql/servers.MYD
  mysqld 24349 mysql 20u REG 8,33 2048 30425182 /home/mysql/mysql/event.MYI
  mysqld 24349 mysql 21u REG 8,33 0 30425183 /home/mysql/mysql/event.MYD
  ...   


  可以看到,总共打开了8个表,每个表分别有2个文件描述符,看来没错。

 3. 再来看 status 结果
  mysql>show global status like 'open_%';
  +------------------------+-------+
  | Variable_name | Value |
  +------------------------+-------+
  | Open_files | 17 |
  | Open_streams | 0 |
  | Open_table_definitions | 15 |
  | Open_tables | 8 |
  | Opened_files | 52 |
  | Opened_tables | 15 |
  +------------------------+-------+


  4. flush tables 后再看看

  mysql>flush tables;
  mysql> show global status like 'open_%';
  +------------------------+-------+
  | Variable_name | Value |
  +------------------------+-------+
  | Open_files | 1 |
  | Open_streams | 0 |
  | Open_table_definitions | 0 |
  | Open_tables | 0 |
  | Opened_files | 52 |
  | Opened_tables | 15 |
  +------------------------+-------+
  lsof | grep /home/mysql
  ...
  mysqld 24349 mysql 5u unix 0x000001041e8de040 4244009 /home/mysql/mysql.sock
  mysqld 24349 mysql 22u unix 0x00000102378ff980 4244128 /home/mysql/mysql.sock
  ...


  可以看到,flush 之后,所有的文件描述符都释放了。

  通过测试可以得知,另一个打开的文件描述符是 slow query log所用。

  如果是有大量的 MyISAM 表,那么就需要特别注意打开文件数是否会超出限制了。

  二、原理

  接下来仔细了解下这个最大文件数相关的参数:

  table_cache (新版本改成了 table_open_cache) The number of cached open tables.

  open_files_limit If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit().

  If this value is 0 then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger)

  number of files.

  如果 open_files_limit 不是设置为 0,则以 setrlimit() 函数计算后的结果为准,如果设置为 0,则实际值是 max_connections*5 或 max_connections + table_cache*2 中的最大者。

  因此,想要解决打开文件数超限的问题,还需要综合系统内核限制(ulimit -n),mysqld自身限制(open_files_limit),以及表缓存数(table_open_cache)等多方面因素。

  不过,实际测试中,发现却不是这样的,open_files_limit采用了内核的最大限制,而非上面的计算结果。

  1. 查看内核限制

  ulimit -n

  65535

  2. 修改 my.cnf 限制

  vi /etc/my.cnf
  ...
  open_files_limit = 10000
  ...


  3. 重启 mysqld

  /etc/init.d/mysql restart

  4. 查看结果

  mysql>show global variables like '%open%';
  | open_files_limit | 65535 |
  | table_open_cache | 1000 |


  5. 不设置 open_files_limit 看看

  vi /etc/my.cnf
  ...
  #open_files_limit = 10000
  ...
  重启
  /etc/init.d/mysql restart
  查看
  mysql>show global variables like '%open%';
  | open_files_limit | 65535 |
  | table_open_cache | 1000 |


  而这个时候,按计算公式结果如下:

  | max_connections | 100 |

  | table_open_cache | 1000 |

  来计算一下:

  max_open_files_1 = max_connections + table_cache * 2 = 100 + 1000 * 2 = 2100

  max_open_files_2 = max_connections*5 = 100 * 5 = 500

  6. 修改 ulimit 试试看:

  unlimit -n 5000
  vi /etc/my.cnf
  ...
  open_files_limit = 10000
  ...
  /etc/init.d/mysql restart
  mysql>show global variables like '%open%';
  | open_files_limit | 10000 |
  | table_open_cache | 1000 |


  open_files_limit 比内核最大限制数还大,因此以 open_files_limit 为准。

  vi /etc/my.cnf
  ...
  #open_files_limit = 10000
  ...
  /etc/init.d/mysql restart
  mysql>show global variables like '%open%';
  | open_files_limit | 5000 |
  | table_open_cache | 1000 |


  看到了,变成了新的内核最大限制

  看到了吧,结果完全跟文档描述的以及mysql源码中写的不一样,看来预编译版本有些地方不太可靠啊 :(

  以上测试在mysql 5.1.23-rc(预编译), mysql-5.1.24-rc(自编译) 以及 5.0.45(预编译) 均一样。

  uname -a
  Linux s1.yejr.com 2.6.9-55.ELsmp #1 SMP Fri Apr 20 16:36:54 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux
  mysql> select version();
  +---------------+
  | version() |
  +---------------+
  | 5.1.23-rc-log |
  +---------------+

推荐阅读
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文主要讨论了在xps15上安装双系统win10和MacOS后,win10无法正常更新的问题。分析了可能的引导问题,并提供了解决方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
author-avatar
情商是你弟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有