set_mempolicy: Operation not permitted
时间: 2023-11-20 18:29:14 浏览: 79
这个错误通常意味着你没有足够的权限来设置内存策略。通常,只有root用户才能使用set_mempolicy()系统调用来更改内存策略。尝试使用root用户身份运行你的程序,或者使用sudo命令以root身份运行程序。如果你仍然遇到同样的问题,可能需要检查系统中是否启用了NUMA功能,或者尝试在不使用set_mempolicy()的情况下运行程序。
相关问题
系统调用set_mempolicy解析为节点
系统调用set_mempolicy用于设置进程的内存策略,包括内存绑定和NUMA节点选择策略。
当将mode参数设置为MPOL_BIND时,可以将进程的内存绑定到指定的节点列表上。在这种模式下,nodemask参数指定了一个节点掩码,其中每个位表示一个NUMA节点。如果nodemask中的某个位为1,则表示该节点可以用于内存绑定;如果为0,则表示该节点不可用于内存绑定。可以使用numa_bitmask_parse函数对节点掩码进行解析。
例如,以下代码将进程的内存绑定到节点0和2上:
```
unsigned long nodemask = 0x5; // 二进制为 0101,表示节点0和2
if (set_mempolicy(MPOL_BIND, &nodemask, 3) < 0) {
perror("set_mempolicy");
exit(EXIT_FAILURE);
}
```
当将mode参数设置为MPOL_PREFERRED或MPOL_INTERLEAVE时,可以设置进程内存分配的首选节点或交错节点。在这种模式下,nodemask参数指定了一个节点掩码,其中每个位表示一个NUMA节点。内核会首先尝试在首选节点上分配内存,如果无法满足要求,则尝试在其他节点上分配内存。可以使用numa_bitmask_parse函数对节点掩码进行解析。
例如,以下代码将进程的内存分配设置为在节点0和2之间交错:
```
unsigned long nodemask = 0x5; // 二进制为 0101,表示节点0和2
if (set_mempolicy(MPOL_INTERLEAVE, &nodemask, 3) < 0) {
perror("set_mempolicy");
exit(EXIT_FAILURE);
}
```
vm.admin_reserve_kbytes = 8192 vm.block_dump = 0 vm.compact_unevictable_allowed = 1 vm.dirty_background_bytes = 0 vm.dirty_background_ratio = 10 vm.dirty_bytes = 0 vm.dirty_expire_centisecs = 3000 vm.dirty_ratio = 20 vm.dirty_writeback_centisecs = 500 vm.dirtytime_expire_seconds = 43200 vm.drop_caches = 3 vm.extfrag_threshold = 500 vm.hugepages_treat_as_movable = 0 vm.hugetlb_shm_group = 0 vm.laptop_mode = 0 vm.legacy_va_layout = 0 vm.lowmem_reserve_ratio = 256 256 32 1 vm.max_map_count = 65530 vm.memory_failure_early_kill = 0 vm.memory_failure_recovery = 1 vm.min_free_kbytes = 67584 vm.min_slab_ratio = 5 vm.min_unmapped_ratio = 1 vm.mmap_min_addr = 65536 vm.mmap_rnd_bits = 28 vm.mmap_rnd_compat_bits = 8 vm.nr_hugepages = 0 vm.nr_hugepages_mempolicy = 0 vm.nr_overcommit_hugepages = 0 vm.numa_stat = 1 vm.numa_zonelist_order = Node vm.oom_dump_tasks = 1 vm.oom_kill_allocating_task = 0 vm.overcommit_kbytes = 0 vm.overcommit_memory = 0 vm.overcommit_ratio = 50 vm.page-cluster = 3 vm.panic_on_oom = 0 vm.percpu_pagelist_fraction = 0 vm.stat_interval = 1 vm.swappiness = 60 vm.user_reserve_kbytes = 131072 vm.vfs_cache_pressure = 100 vm.watermark_scale_factor = 10 vm.zone_reclaim_mode = 0
这是一个包含多个与虚拟内存相关的系统参数的列表。以下是其中一些参数的解释:
- `vm.max_map_count`:最大映射数量,限制了内存中可以同时映射的页面数量,从而影响了缓存的大小。
- `vm.dirty_background_bytes` 和 `vm.dirty_background_ratio`:脏页的阈值,当脏页的数量超过该阈值时,系统会开始写回脏页。
- `vm.dirty_bytes` 和 `vm.dirty_ratio`:系统允许脏页占用的内存大小的上限。
- `vm.min_free_kbytes`:系统保留的空闲内存的大小,当空闲内存低于该值时,系统会开始清理缓存。
- `vm.swappiness`:控制系统在内存不足时使用交换空间的程度,该参数的值越高,系统越可能使用交换空间。
你可以使用 `sysctl` 命令来修改这些参数的值,具体的命令如下:
```
sysctl -w <parameter>=<value>
```
其中 `<parameter>` 表示参数名,`<value>` 表示你希望设置的值。请注意,该命令的修改是临时的,如果你想要永久生效,需要将修改写入到 `/etc/sysctl.conf` 配置文件中。