好好学习,天天向上,物理好资源网(原物理ok网)欢迎您!
当前位置:首页 > > 信息公告 > 内容页

物理显存充足,而且为何用代码总申请不到显存呢?

2023-10-05 20:23:35信息公告58

作者|牧原N7v物理好资源网(原物理ok网)

来源|程序猿石头(ID:)N7v物理好资源网(原物理ok网)

头图|CSDN下载自东方IC本文作者:杨牧原(花名牧原),阿里云技术专家,多年操作系统和应用调试经验,理论造诣深厚什么是物理内存,实践经验丰富。目前专注Linux性能调优,容器集群和系统网路。N7v物理好资源网(原物理ok网)

背景N7v物理好资源网(原物理ok网)

某次遇见一个顾客尝试用Java(虽然跟具体用哪些语言没关系)申请使用4G的显存申请,机器(ECS)总显存是8G,free的显存也超过4G,按道理是OK的,但总是直接OOM。N7v物理好资源网(原物理ok网)

于是便找上门来说,“你们这玩意儿有问题啊?”N7v物理好资源网(原物理ok网)

内心:“bug是不可能有的,一定是你的打开坐姿不对”,恩,不行,本着“客户第一”的原则,还是要来帮顾客解锁坐姿的。N7v物理好资源网(原物理ok网)

本文就详尽记录了这个case的排查过程。N7v物理好资源网(原物理ok网)

具体过程N7v物理好资源网(原物理ok网)

申请4g显存失败N7v物理好资源网(原物理ok网)

如上图所示,记录显示为申请4G显存失败(B/1024/1024=4096M)。N7v物理好资源网(原物理ok网)

是否是&配置错误?N7v物理好资源网(原物理ok网)

第一反应是想上去之前的vm.&造成的free小于案例有关N7v物理好资源网(原物理ok网)

什么是物理内存_物理内存是运行内存吗_物理内存是RAM吗N7v物理好资源网(原物理ok网)

统计的是所有显存的free显存,而统计的是可以用来给程序用的显存,而顾客设置了vm.(2.5G),这个显存在free统计,并且不在统计,也会有这个问题。N7v物理好资源网(原物理ok网)

两者的统计方法不一样,具体参考//proc.txtN7v物理好资源网(原物理ok网)

跟顾客要free-m&&-p&&/proc/等信息剖析问题。N7v物理好资源网(原物理ok网)

#-pnet.ipv4.=0net.ipv4.conf..=.sysrq=.=1net.ipv4.=1...net.ipv4.=1net.ipv4.==.=2...#cat/proc/::::18924::0::(anon):(anon):552(file):59068(file):kB....:::::2048:::kBN7v物理好资源网(原物理ok网)

尝试再现N7v物理好资源网(原物理ok网)

尝试自行测试使用java命令,去申请超出我的测试机化学显存,领到报错。N7v物理好资源网(原物理ok网)

实际里面的早已说明了问题,而且因为经验不足,一时没有看明白如何回事。N7v物理好资源网(原物理ok网)

下边测试证明正常申请显存不会有问题,超额的显存就会OOM。N7v物理好资源网(原物理ok网)

[root@test~]#java--"1.8.0_242"(build1.8.0_242-b08)64-BitVM(build25.242-b08,mixedmode)[root@test~]#java--64-BitVM:INFO:os::(,,0);error=''(errno=12)......N7v物理好资源网(原物理ok网)

系统信息如下:N7v物理好资源网(原物理ok网)

---------------SYSTEM---------------OS:Linux7。4。1708(Core)uname:Linux3。10。0-693。2。2。el7。#1SMPTueSep1222:26:13UTC2017:glibc2。17NPTL2。:STACK8192k,CORE0k,NPROC15088,65535,AS:0。050。050。05/proc/:::::69016::0::kB。。。::14280::0:30720:::::2048:57216::kB。N7v物理好资源网(原物理ok网)

。。。:4kpage,(free),swap0k(0kfree):64-BitVM(25。242-b08)forlinux-amd64JRE(1。8。0_242-b08),builtonJan28202014:28:22by""withgcc4。8。5(RedHat4。8。5-39)time:ThuFeb2015:13:30:time:0(0d0h0m0s)N7v物理好资源网(原物理ok网)

再现失败,继续剖析N7v物理好资源网(原物理ok网)

Java测试证明正常申请显存不会有问题,超额的显存就会OOM,这么为何超额呢,视线回归到-p有所发觉。N7v物理好资源网(原物理ok网)

vm.=2N7v物理好资源网(原物理ok网)

关于设置项:N7v物理好资源网(原物理ok网)

物理内存是RAM吗_什么是物理内存_物理内存是运行内存吗N7v物理好资源网(原物理ok网)

=0N7v物理好资源网(原物理ok网)

默认设置,当应用进程尝试申请显存时,内核会做一个测量。内核将检测是否有足够的可用显存供应用进程使用;N7v物理好资源网(原物理ok网)

假如有足够的可用显存,显存申请准许;否则,显存申请失败,并把错误返回给应用进程。N7v物理好资源网(原物理ok网)

举个反例,例如1G的机器,A进程早已使用了500M,当有另外进程尝试500M的显存时,内核都会进行check,发觉超出剩余可用显存,还会提示失败。N7v物理好资源网(原物理ok网)

=1N7v物理好资源网(原物理ok网)

对于显存的申请恳求,内核不会做任何check,直至化学显存用完,触发OOM杀用户态进程。N7v物理好资源网(原物理ok网)

同样是前面的反例,1G的机器,A进程500M,B进程尝试500M,会成功,而且一旦发觉显存使用率接近1个G(内核有策略),就触发OOM,杀掉一些用户态的进程(有策略的杀)。N7v物理好资源网(原物理ok网)

=2N7v物理好资源网(原物理ok网)

当恳求申请的显存>=SWAP显存大小+化学显存*N什么是物理内存,则拒绝这次显存申请。解释下这个N:N是一个比率,按照/100来确定,例如=50(我的测试机默认50%),这么N就是50%。vm.只有当vm.=2的时侯才能生效,显存可申请显存为SWAP显存大小+化学显存*/100。N7v物理好资源网(原物理ok网)

瞧瞧里面日志的信息:N7v物理好资源网(原物理ok网)

具体而言:N7v物理好资源网(原物理ok网)

5,两相对照,说明顾客设置的vm.在生效,建议改回0再试试。N7v物理好资源网(原物理ok网)

[root@test~]#grep-i/proc/::kB#java--失败了64-BitVM:INFO:os::(,,0);error=''(errno=12)##ThereisfortheJavato.#(mmap)tomapbytesfor.#Anerrorfilewithmoreissavedas:#/root/.log#vm.=0#vm.=50[root@test~]#java--"1.8.0_242"(build1.8.0_242-b08)64-BitVM(build25.242-b08,mixedmode)N7v物理好资源网(原物理ok网)

最后N7v物理好资源网(原物理ok网)

可以看出,这或许跟具体的编程语言没有关系,用Java申请不到,用c++/c也一样。一个容易忽视的小知识点,你get到了吗?N7v物理好资源网(原物理ok网)

本文节选自《ECS运维手册之Linux系统确诊》,《ECS运维手册之Linux系统确诊》是牧原呕心沥血之作,除了内容精益求精,代码的编排作者也花了不少心思。你可以直接登入阿里云开发者社区下载本书——《ECS运维手册之Linux系统确诊》。阿里云开发者社区有不少高质量技术文章,你们可以去观摩学习,有好多书籍都是可以直接免费下载的。N7v物理好资源网(原物理ok网)