操作系统信息
Linux user-pc 5.4.18-87.76-generic #gfb16-KYLINOS SMP Thu Aug 31 09:05:44 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux
解决方案
当前使用gsql -d postgres -p 5432 -r
命令登录数据的时候,报错如下:
gsql: FATAL: could not look up local user ID 1002: Too many open files
报错信息 gsql: FATAL: could not look up local user ID 1002: Too many open files
指出系统达到了打开文件的数量上限,并且是在尝试查找本地用户ID时发生的。这个问题通常与操作系统的资源限制有关,而不是特定的代码实现问题。
要解决这个问题,你需要增加操作系统允许的文件打开数量。以下是在Linux系统上解决此问题的步骤:
- 临时增加文件打开数量限制:
使用ulimit
命令临时增加当前会话的文件打开数量限制。
ulimit -n 65535
- 永久增加文件打开数量限制:
编辑/etc/security/limits.conf
文件,添加或修改以下行来永久增加限制。
* soft nofile 65535
* hard nofile 65535
这里的 *
表示对所有用户生效。你也可以指定特定的用户名来仅对特定用户生效。
-
应用限制并重启服务:
修改完/etc/security/limits.conf
文件后,你需要重启系统或至少重启受影响的服务(如openGauss数据库服务)来使更改生效。 -
检查并关闭不必要的应用程序:
确保没有不必要的应用程序或服务占用文件句柄。 -
优化数据库配置:
检查并优化openGauss的配置,以减少不必要的文件打开请求。
进一步解决问题
通过上面的步骤一般情况下是可以解决问题的,但是现在我们重启服务后,发现问题依然存在,此时我们查看看一下数据库进程。
omm@user-pc:/media/user/D/datanode/gsdn$ systemctl status openGauss.service
● openGauss.service - 華為openGauss數據庫服務...
Loaded: loaded (/etc/systemd/system/openGauss.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2024-08-29 16:28:35 CST; 1h 7min ago
Process: 180477 ExecStart=/usr/local/bin/gs_ctl start -D /media/user/D/datanode/gsdn (code=exited, status=0/SUCCESS)
Main PID: 180483 (gaussdb)
Tasks: 38 (limit: 18929)
Memory: 2.3G
CGroup: /system.slice/openGauss.service
└─180483 /media/user/D/openGauss-server/dest/bin/gaussdb -D /media/user/D/datanode/gsdn
从上面的数据信息可以得到openGauss的进程ID是180483
,下面我们统计一下该进程的打开数量。
user@user-pc:~$ sudo lsof -p 180483 | wc -l
输入密码
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
1274
上面的输出信息得到打开数量为1274
我们看一下该进程的limits
信息
user@user-pc:~$ cat /proc/180483/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 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 63099 63099 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 63099 63099 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
到此问题找到了,进程实际限制的1024
个,但是实际打开了1274
个,故报此错误。
由于上面我们已经设置了,但是发现并没有生效,什么原因呢?
猜测有没有可能是被系统级设置覆盖了。
omm@user-pc:/media/user/D/datanode/gsdn$ cat /etc/systemd/system.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See systemd-system.conf(5) for details.
[Manager]
#LogLevel=info
#LogTarget=journal-or-kmsg
#LogColor=yes
#LogLocation=no
#DumpCore=yes
#ShowStatus=yes
#CrashChangeVT=no
#CrashShell=no
#CrashReboot=no
#CtrlAltDelBurstAction=reboot-force
#CPUAffinity=1 2
#NUMAPolicy=default
#NUMAMask=
#RuntimeWatchdogSec=0
#RebootWatchdogSec=10min
#ShutdownWatchdogSec=10min
#KExecWatchdogSec=0
#WatchdogDevice=
#CapabilityBoundingSet=
#NoNewPrivileges=no
#SystemCallArchitectures=
#TimerSlackNSec=
#StatusUnitFormat=description
#DefaultTimerAccuracySec=1min
#DefaultStandardOutput=journal
#DefaultStandardError=inherit
#DefaultTimeoutStartSec=90s
#DefaultTimeoutAbortSec=
#DefaultRestartSec=100ms
#DefaultStartLimitIntervalSec=10s
#DefaultStartLimitBurst=5
#DefaultEnvironment=
#DefaultCPUAccounting=no
#DefaultIOAccounting=no
#DefaultIPAccounting=no
#DefaultBlockIOAccounting=no
#DefaultMemoryAccounting=yes
#DefaultTasksAccounting=yes
#DefaultTasksMax=
#DefaultLimitCPU=
#DefaultLimitFSIZE=
#DefaultLimitDATA=
#DefaultLimitSTACK=
#DefaultLimitCORE=
#DefaultLimitRSS=
#DefaultLimitNOFILE=1024:524288
#DefaultLimitAS=
#DefaultLimitNPROC=
#DefaultLimitMEMLOCK=
#DefaultLimitLOCKS=
#DefaultLimitSIGPENDING=
#DefaultLimitMSGQUEUE=
#DefaultLimitNICE=
#DefaultLimitRTPRIO=
#DefaultLimitRTTIME=
从上面的信息可以看出系统级默认限制是1024个,那我们就更改一下这里的数量,设置为DefaultLimitNOFILE=65535:524288
,更新后重启数据库。
再次查看,openGauss进程的limits信息,如下
omm@user-pc:/media/user/D/datanode/gsdn$ cat /proc/180483/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 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 63099 63099 processes
Max open files 65535 524288 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 63099 63099 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
查看数据库日志,发现Too many open files
错误信息消失,下面我们通过gsql
命令工具登录数据库。
omm@user-pc:/media/user/D/datanode/gsdn$ gsql -d postgres -p 5432 -r
gsql ((openGauss 6.0.0 build ) compiled at 2024-08-06 17:27:08 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
openGauss=#
登录成功!
到这里,这个问题也就解决了。