前言

有些问题,在开发过程中不会遇到;但当要在生产环境中进行部署的时候便会暴露出来。

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1040, 'Too many connections')

为什么会引发这个问题?因为生产环境的 CPU 核心数太多了。

业务进程的数量一般为 CPU 数量的倍数,而数据库进程最大打开文件数一般为常量(记得默认好像是100+),那么假设一个 CPU 启动两个进程,两个进程各建立四个连接,很容易就会超过这个数量而导致异常。

解决方案

  • 尝试了修改 MariaDB 自身配置的连接数设置,无果,连接数仍然受限。

  • 将以下内容添加至/usr/lib/systemd/system/mariadb.service,并重启服务即可。

LimitNOFILE=infinity
  • 建立连接,在Linux中也算作打开文件,所以其实真正的原因是打开的文件数量过多了;而数据库的服务由 systemd 托管,那么解铃人还需系铃人。