我有一个 qnap nas 单元,我试图在其上创建额外的 iscsi 目标,但创建过程失败。我并没有尝试做我在其他相同单元上没有做过的事情,但这个单元已经运行了很长时间。
ssh 进去看看
dmesg 包含许多其他内容:
[3431220.016334] SLAB: Unable to allocate memory on node 0 (gfp=0xd0)
[3431220.016335] cache: kmalloc-65536, object size: 65536, order: 4
[3431220.016341] node 0: slabs: 12/12, objs: 12/12, free: 0
好的,我们找到问题的原因了。
# cat /proc/meminfo
MemTotal: 3939760 kB
MemFree: 190480 kB
Buffers: 3212476 kB
Cached: 188868 kB
SwapCached: 48 kB
因此所有内存都分配给了缓冲区。在 Linux 机器上,除了阻止 IO 之外几乎不做其他事情,这并不奇怪
# cat /proc/buddyinfo
Node 0, zone DMA 8 2 1 1 1 1 1 1 2 2 2
Node 0, zone DMA32 22614 389 0 1 1 2 3 1 0 0 0
Node 0, zone Normal 12150 7683 0 2 5 2 1 1 0 0 0
哎哟。这显示了一些严重的内存碎片,几乎没有大于 8K 的可用块。除了重新启动机器之外,还有什么方法可以清除内存碎片问题(暂时减少分配给缓冲区的内存或其他方法),这个过程会非常不方便?此外,给这样使用的机器增加更多内存是否有助于解决这个特定问题,升级内存显然还有其他好处。
答案1
尝试发出sync; echo 3 > /proc/sys/vm/drop_caches
。这将释放所有缓存/缓冲内存。
如果这不起作用,您可以尝试压缩/碎片整理内存,发出以下命令:echo 1 > /proc/sys/vm/compact_memory