【问题标题】:mlockall(): cannot allocate memorymlockall(): 无法分配内存
【发布时间】:2018-04-09 06:21:20
【问题描述】:

我收到错误: mlockall 失败:无法分配内存 调用函数 mlockall() 时:

if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
            printf("mlockall failed: %m\n");
            exit(-2);
    }

使用的IDE:Eclipse 操作系统:Ubuntu 16.04 实时扩展使用:4.11.12 rt-15(抢占补丁) 注意:我正在尝试实时进行 UDP 连接(使用英特尔 i210 以太网控制器)。

当我在 Eclipse 中调试相同的内容时,显示的是:

在“/build/glibc-bfm8X4/glibc-2.23/misc/../sysdeps/unix/syscall-template.S”中找不到源文件 找到文件或编辑源查找路径以包含其位置。

如何解决?

【问题讨论】:

  • 我有这个:Can't find a source file at "/build/glibc-p3Km7c/glibc-2.24/io/../sysdeps/unix/syscall-template.S" Locate the file or edit the source lookup path to include its location. 用于不同的问题,只有当我在调试模式下从 IDE 执行构建的程序时。从控制台,它可以工作。所以它似乎只与 IDE 配置有关,与我们的应用程序无关

标签: ubuntu preempt-rt


【解决方案1】:

正如man 2 mlockall 解释的那样,您似乎没有权限锁定您尝试锁定的内存量。您可以调整该限制,或尝试以 root 身份运行您的程序,例如通过sudo。除了找出限制是否真的是问题之外,我不建议使用后者做任何事情,所以这里是如何在 Kubuntu 上调整 bash 的限制 - 它在您的发行版上可能会有所不同。

首先,让我们看看你的极限是多少:

$ ulimit -a | grep locked
max locked memory       (kbytes, -l) 64

64 KB 并不多!对此也有一个简写:

$ ulimit -l
64

您很可能无法轻松调整限制:

$ ulimit -l 1000000
bash: ulimit: max locked memory: cannot modify limit: Operation not permitted

即使你是,它也不会在 shell 调用、重启等过程中持续存在。所以我们需要一种不同的方法。

/etc/security/limits.conf 来救援!这是在用户会话启动时读取限制默认值的文件 - 请参阅 man 5 limits.conf

添加以下行(nobss 是我的用户名,显然你应该使用你的)

nobss - memlock 1000000

将硬限制和软限制都设置为 1000000 KB。注销并登录,然后瞧:

$ $ ulimit -l
1000000

这样更好。除非你的程序使用大量内存,否则这个限制应该可以做到——事实上,在大多数情况下它已经足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 2017-07-15
    • 2015-08-15
    • 2015-04-01
    • 2017-12-05
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多