在我的Android应用中,我遇到Too many open files
错误的多个问题。
我确定我的应用程序中没有文件描述符泄漏,并且我当前的上限设置为1024个打开的文件:
adb shell ulimit -a
time(cpu-seconds) unlimited
file(blocks) unlimited
coredump(blocks) 0
data(KiB) unlimited
stack(KiB) 8192
lockedmem(KiB) 64
nofiles(descriptors) 1024
processes 12016
sigpending 12016
msgqueue(bytes) 819200
maxnice 40
maxrtprio 0
resident-set(KiB) unlimited
address-space(KiB) unlimited
我没有root权限,所以我试图用以下命令增加此数字:
adb shell ulimit -n 2048
但是限制没有改变。因此,我更改了用户ID并重试:
adb shell run-as [package.name]
~ ulimit -n 2048
~ ulimit -a
limit -a
time(cpu-seconds) unlimited
file(blocks) unlimited
coredump(blocks) 0
data(KiB) unlimited
stack(KiB) 8192
lockedmem(KiB) 64
nofiles(descriptors) 2048
processes 12016
sigpending 12016
msgqueue(bytes) 819200
maxnice 40
maxrtprio 0
resident-set(KiB) unlimited
address-space(KiB) unlimited
而且我已经实现了仅针对当前进程增加此限制。重新启动应用程序后,限制再次为1024。
还有其他方法可以永久增加此限制吗?
P.S。我也搜索了/etc/security/limits.conf
文件,但没有任何运气
不是使用ulimit -n
增加打开的最大文件数,而是可以使用ndk的sytem api getrlimit/setrlimit
获取或设置资源限制。您可以在应用启动或应用运行期间调用这些api。
struct rlimit rlm {};
if (getrlimit(RLIMIT_NOFILE, &rlm) < 0) {
LOGE("getrlimit %s", strerror(errno));
} else {
__android_log_print(ANDROID_LOG_DEBUG, TAG, "%d %d", rlm.rlim_cur, rlm.rlim_max);
rlm.rlim_cur = rlm.rlim_max;
if (setrlimit(RLIMIT_NOFILE, &rlm) < 0) {
LOGE("setrlimit %s", strerror(errno));
}
}
但是您可能无法对Android中的资源限制进行调整,在我测试的Android设备中,打开文件的当前限制和最大限制分别为1024/1346。即使将限制设置为最大值1346,也不会获得太多好处。
从getrlimit/setrlimit
中查看man7的更多信息。