当我具有正确的功能时,无法打开/ proc / self / oom_score_adj

weixin_38063608 weixin_38063608 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我试图为一个过程设置OOM杀手分数调整,受到oom_adjust_setup in OpenSSH’s port_linux.c的启发.为此,我打开/ proc / self / oom_score_adj,读取旧值,并写入一个新值.显然,我的进程需要是root或具有CAP_SYS_RESOURCE能力才能做到这一点. 我得到了一个我无法解释的结果.当我的进程没有该功能时,我能够打开该文件并读取和写入值,尽管我写的值没有生效(足够公平): $./a.out CAP_SYS_RESOURCE: not effective, not permitted, not inheritable oom_score_adj value: 0 wrote 5 bytes oom_score_adj value: 0 但是当我的进程确实具有该功能时,我甚至无法打开该文件:它与EACCES失败: $sudo setcap CAP_SYS_RESOURCE+eip a.out $./a.out CAP_SYS_RESOURCE: effective, permitted, not inheritable failed to open /proc/self/oom_score_adj: Permission denied 为什么这样做?我错过了什么? 一些进一步的谷歌搜索引导我到this lkml post by Azat Khuzhin on 20 Oct 2013.显然CAP_SYS_RESOURCE允许您更改任何进程的oom_score_adj,但你自己.要更改自己的分数调整,您需要将其与CAP_DAC_OVERRIDE结合使用 – 即禁用所有文件的访问控制. (如果我想要的话,我会把这个程序设为setuid root.) 所以我的问题是,如果没有CAP_DAC_OVERRIDE,我怎样才能做到这一点? 我正在运行Ubuntu xenial 16.04.4,内核版本4.13.0-45-generic.我的问题类似但与this question不同:这是关于写入时的错误,当没有能力时. 我的示例程序: #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/capability.h> void read_value(FILE *fp) { int value; rewind(fp); if (fscanf(fp, "%d", &value) != 1) { fprintf(stderr, "read failed: %s\n", ferror(fp) ? strerror(errno) : "cannot parse"); } else { fprintf(stderr, "oom_score_adj value: %d\n", value); } } void write_value(FILE *fp) { int result; rewind(fp); result = fprintf(fp, "-1000"); if (result < 0) { fprintf(stderr, "write failed: %s\n", strerror(errno)); } else { fprintf(stderr, "wrote %d bytes\n", result); } } int main() { FILE *fp; struct __user_cap_header_struct h; struct __user_cap_data_struct d; h.version = _LINUX_CAPABILITY_VERSION_3; h.pid = 0; if (0 != capget(&h, &d)) { fprintf(stderr, "capget failed: %s\n", strerror(errno)); } else { fprintf(stderr, "CAP_SYS_RESOURCE: %s, %s, %s\n", d.effective & (1 << CAP_SYS_RESOURCE) ? "effective" : "not effective", d.permitted & (1 << CAP_SYS_RESOURCE) ? "permitted" : "not permitted", d.inheritable & (1 << CAP_SYS_RESOURCE) ? "inheritable" : "not inheritable"); } fp = fopen("/proc/self/oom_score_adj", "r+"); if (!fp) { fprintf(stderr, "failed to open /proc/self/oom_score_adj: %s\n", strerror(errno)); return 1; } else { read_value(fp); write_value(fp); read_value(fp); fclose(fp); } return 0; }
...全文

相关推荐

Android中进程的ADJ值.pdf

Android中进程的ADJ值,什么是ADJ,它和进程的优先级有什么关系。Android中进程的ADJ值,什么是ADJ,它和进程的优先级有什么关系。Android中进程的ADJ值,什么是ADJ,它和进程的优先级有什么关系。Android中进程的ADJ值,什么是ADJ,它和进程的优先级有什么关系。Android中进程的ADJ值,什么是ADJ,它和进程的优先级有什么关系。Android中进程的ADJ值,什么是ADJ,它和进程的优先级有什么关系。Android中进程的ADJ值,什么是ADJ,它和进程的优先级有什么关系。Android中进程的ADJ值,什么是ADJ,它和进程的优先级有什么关系。

川峰

MySQL OOM 系统二 OOM Killer

前面一节重点分享了Linux的内存分配策略,基于上述的分配策略,为了规避超售的风险,Linux采了一种OOM Killer的机制,即系统可用内存(包括Swap)即将使用完之前,选择性的Kill掉一些进程以求释放一些内存

weixin_38742951

time.tar_c_

example cat /proc/1912312268/oom_score_adj

心若悬河

OOM终结者解析[项目源码]

本文详细介绍了Linux系统中的Out of memory killer(OOM终结者)机制,该机制在系统内存极低时会自动杀死某些进程以保护系统。文章首先通过一个Java进程异常退出的案例展示了OOM killer的工作过程,包括如何通过dmesg命令查看相关日志。接着解释了OOM killer的工作原理,它采用启发式算法对所有进程进行评分,得分最低的进程将被终止。文章还提供了三种解决OOM问题的方法:迁移到更大内存的实例、进行OOM killer调优或负载均衡、降低应用内存需求。此外,文中还介绍了如何通过调整/proc文件系统中的参数来控制OOM killer的行为,包括oom_adj和oom_score的设置。最后,文章简要提及了Java中常见的内存溢出错误处理方法和垃圾回收次数的监控方式。

青柠汽水308

Linux 系统优化的一些建议(内核优化)

关闭swap 如果服务器上有运行数据库服务或消息中间件服务,请关闭交换分区 echo vm.swappiness = 0 >> /etc/sysctl.conf sysctl -p OOM Killer 一般我们的linux服务都是混部服务的,每个程序申请的物理内存都是共享的;例如物理内存只有1g,启动2个程序各申请1g是可以的,linux通过这种过度分配的方式来达到内存的充分利用,当程序实际使用内存超出物理内存时,会被系统按照优先级,杀掉一部分程序以确保其它程序的正常运行;为了避免核心服务被杀,可以将进程文件设置为最高优先级。 # 数值越小越不容易被杀 echo -17 > /pro

weixin_38689338
评论 1
收藏 已收藏
分享
返回顶部