nova-conductor.log 报错:
ERROR nova.scheduler.utils [req-9880cb62-7a70-41aa-b6c0-db4ec5333e98 53a1cf0ad2924532aa4b7b0750dec282 0ab2dbde4f754b699e22461426cd0774 - - -] [instance: 36bb1220-f295-4205-ba2e-6e41f8b134b9] Error from last host: xiandian (node xiandian): [u'Traceback (most recent call last):\n', u'File"/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 1926, in _do_build_and_run_instance\n filter_properties)\n', u'File"/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 2116, in _build_and_run_instance\n instance_uuid=instance.uuid, reason=six.text_type(e))\n', u"RescheduledException: Build of instance 36bb1220-f295-4205-ba2e-6e41f8b134b9 was re-scheduled: internal error: process exited while connecting to monitor: 2019-05-20T17:38:19.473598Z qemu-kvm: cannot set up guest memory'pc.ram': Cannot allocate memory\n\n"]
错误信息: 无法分配内存
处理方法: 1. 增加计算节点内存 2. 修改内核参数
在这使用修改内核参数的方法:
先看下主机可以分配多少内存
- [[email protected] ~]# sysctl -a | grep overcommit
- vm.nr_overcommit_hugepages = 0
- vm.overcommit_kbytes = 0
- vm.overcommit_memory = 0
- vm.overcommit_ratio = 50
- ### 内核参数 overcommit_memory 它是 内存分配策略
可选值: 0,1,2.
0, 表示内核将检查是否有足够的可用内存供应用进程使用; 如果有足够的可用内存, 内存申请允许; 否则, 内存申请失败, 并把错误返回给应用进程.
1, 表示内核允许分配所有的物理内存, 而不管当前的内存状态如何.
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
什么是 Overcommit 和 OOM
Linux 对大部分申请内存的请求都回复 "yes", 以便能跑更多更大的程序. 因为申请内存后, 并不会马上使用内存. 这种技术叫做 Overcommit. 当 Linux 发现内存不足时, 会发生 OOM killer(OOM=out-of-memory). 它会选择杀死一些进程 (用户态进程, 不是内核线程), 以便释放内存.
当 oom-killer 发生时, Linux 会选择杀死哪些进程? 选择进程的函数是 oom_badness 函数 (在 mm/oom_kill.c 中), 该函数会计算每个进程的点数 (0~1000). 点数越高, 这个进程越有可能被杀死. 每个进程的点数跟 oom_score_adj 有关, 而且 oom_score_adj 可以被设置 (-1000 最低, 1000 最高).
解决方法
三种方法: 将 vm.overcommit_memory 设为 1 即可
1. 编辑 / etc/sysctl.conf , 改 vm.overcommit_memory=1, 然后 sysctl -p 使配置文件生效
- sysctl vm.overcommit_memory=1
- echo 1> /proc/sys/vm/overcommit_memory
来源: http://www.bubuko.com/infodetail-3065555.html