【现象】
测试环境140虚机,机房断电一次,服务器重启后无法创建虚拟机一直显示scheduler(调度),查看日志报错数据库报错1040:too many connections,显示连接数太多。
【分析】
查看openstack数据库配置文件(使用MariaDB),按照官网配置:
[root@controller user]# vim /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address = 10.1.XX.XXX
default-storage-engine = innodb
innodb_file_per_table
max_connections = 1024
collation-server = utf8_general_ci
character-set-server = utf8
已经定义max_connections为1024,最大支持连接数16384,那就修改max_connections = 16000
保存配置重启服务仍然不行。
进入数据库查看使用情况:
mysql -uroot -pxxxx
MariaDB [(none)]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value | +-----------------+-------+
| max_connections | 214 | +-----------------+-------+
MariaDB [(none)]> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value | +----------------------+-------+
| Max_used_connections | 215 | +----------------------+-------+
max_connections:最大连接数214,
Max_used_connections:最大已用连接数215,
MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到了max_connections。因此MySQL的实际最大可连接数为 max_connections+1;
现在已用连接数已经达到最大数,所以虚拟机无法再创建,dashboard上面经常无法刷新flavor、image列表就可以解释了。
但是,为什么是214呢,我们不是修改了配置文件为1024吗?为什么没生效呢?
【解决】
原因在于Centos7/RHEL7的系统中,systemd对系统资源有限制,配置如下:
全局的配置,放在文件/etc/systemd/system.conf和/etc/systemd/user.conf。
同时,也会加载两个对应的目录中的所有.conf文件
/etc/systemd/system.conf.d/.conf和/etc/systemd/user.conf.d/.conf
其中,system.conf是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。systemd.conf.d/*.conf中配置会覆盖system.conf。
我们在system.conf中添加以下两个参数,数目自定义,我们写100000.
# vim /etc/systemd/system.conf
[Manager]
DefaultLimitNOFILE=100000
DefaultLimitNPROC=100000
或者修改单个service的资源限制:
编辑/usr/lib/systemd/system/mariadb.service
在【service】字段下添加:
LimitNOFILE=50000
LimitNPROC=50000
然后保存配置,执行:
# systemctl daemon-reload
# systemctl restart mariadb.service
最后到数据库中重新查看连接数,最大连接数已经改为我们在 /etc/my.cnf.d/openstack.cnf
中设置的数值
mysql -uroot -pxxxx
MariaDB [(none)]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value | +-----------------+-------+
| max_connections | 16000 | +-----------------+-------+
MariaDB [(none)]> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value | +----------------------+-------+
| Max_used_connections | 385 | +----------------------+-------+