openGauss

开源数据库

openGauss社区官网

开源社区

MogDB使用Systemd系统服务自启问题

云和恩墨-何放2022-05-24MogDB使用Systemd系统服务自启问题

MogDB 使用 Systemd 系统服务自启问题

本文出处:https://www.modb.pro/db/228477

问题由来是我们发现 MogDB 数据库日志频频出现的报错:

[BACKEND] LOG:  out of file descriptors: Too many open files; release and retry
[BACKEND] LOG:  could not open temporary statistics file "pg_stat_tmp/pgstat.stat": Too many open files
[BACKEND] LOG:  out of file descriptors: Too many open files; release and retry
[BACKEND] LOG:  could not open temporary statistics file "pg_stat_tmp/pgstat.stat": Too many open files
[BACKEND] LOG:  count not accept new connection: Too many open files

字面意思理解就是,打开文件过多,要求释放再尝试。日志报上述情况,是从最近的一次服务器重启之后,数据库以开机自启动的方式运行,启动脚本通过 Systemctl 服务配置的。

让我们想到查看文件最大 open file 限制,和数据库进程打开文件数。

[omm@node1 ~]$ ps -ef|grep mogdb
omm        1298      1  2 13:15 ?        00:03:52 /dbdata/app/mogdb/bin/mogdb -D /dbdata/data
[omm@node1 ~]$ lsof -p 1298 |wc -l
1038
[omm@node1 ~]$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62936
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1000000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

通过进程号查询得出,当前 MogDB 进程真实使用的大小为 1038,ulimit -a 中 open files 为 1000000,其中肯定有问题,同时查看临时文件数和临时文件大小。

postgres=# select temp_files,temp_bytes/1024/1024/1024 from dbe_perf.stat_database;
 temp_files |  temp_bytes
------------+--------------
          0 |            0
          0 |            0
      85195 | 120819658163
          0 |            0
(4 rows)
postgres=# show temp_file_limit;
 temp_file_limit
-----------------
 -1
(1 row)
postgres=# show max_files_per_process;
 max_files_per_process
-----------------------
 100000
(1 row)
检查/etc/security/limits.conf,参数均已设置正确。

这些均已排查,不存在问题,但更根据同样的 MogHA 自启脚本,发现设置有所不同。

[Unit]
Description=High Avilable service for MogDB or openGauss
After=network.target remote-fs.target nss-lookup.target

[Service]
Environment=GAUSSHOME=/dbdata/app/mogdb
Environment=PGDATA=/dbdata/data
Environment=LD_LIBRARY_PATH=/dbdata/app/mogdb/lib:/dbdata/app/tools/lib:
LimitAS=infinity
LimitRSS=infinity
LimitCORE=infinity
LimitNOFILE=1000000
LimitNPROC=65536
Type=simple
User=omm
WorkingDirectory=/dbdata/app/mogha
ExecStart=/dbdata/app/mogha/prod_venv/bin/supervisord -c /dbdata/app/mogha/supervisord.conf
KillSignal=SIGTERM
TimeoutStopSec=5
KillMode=process
PrivateTmp=false
[Install]
WantedBy=multi-user.target

自启脚本中添加了 LimitNOFILE=1000000,同样的 MogDB 自启脚本却没设置,进而注意力转向查看进程 limits 数。

[omm@node1 ~]$ ps -ef|grep mogdb
omm        1298      1  2 13:15 ?        00:03:52 /dbdata/app/mogdb/bin/mogdb -D /dbdata/data
omm       11922  11786  0 15:39 pts/0    00:00:00 grep --color=auto mogdb
[omm@node1 ~]$ cat /proc/1298/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        unlimited            unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             62906                62906                processes
Max open files            1024                 524288               files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       62906                62906                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

上述 Max open files,Soft Limit 为 1024,Hard Limit 为 524288。打开文件数超过 Hard Limit 值就会影响数据库进程。

如果使用 init 脚本手动启动数据库,则数据库进程将继承修改后限制,但如果数据库是在 boot 时启动或由类似 systemd 的程序启动,则不会。对于有“/etc/default/service”文件的 Debian 系统,有“/etc/sysconfig/service”文件的 RedHat 系统。在运行守护程序之前,这些文件由 init 脚本获取。将 ulimit-s unlimit 或类似这样的内容添加到这些文件中。这些限制将应用于 init 脚本外壳,并将影响数据库进程。数据库恢复正常得手动重启。

gs_om -t restart

获取 MogDB 进程,查询使用大小

[omm@node1 ~]$ ps -ef|grep mogdb
omm        57142       1  5 14:06 pts/1    00:06:54 /dbdata/app/mogdb/bin/mogdb -D /dbdata/data
omm        66867   54676  0 16:21 pts/1    00:00:00 grep mogdb
[omm@node1 ~]$ cat /proc/57142/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        unlimited            unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             unlimited            unlimited            processes
Max open files            1000000              1000000              files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       62926                62926                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

MogDB 进程最大打开文件数 1000000 及正常。