比较来自世界各地的卖家的域名和 IT 服务价格

记忆碎片 Linux

有没有办法检测内存碎片 Linux? 这是由于一些长期工作服务器,我注意到生产力下降,只有在重新启动过程后,我看到了更好的性能。 我注意到使用巨大的页面支持时更多 Linux - 巨大的页面B. Linux 更容易破碎碎片吗?

特别是,我看了 / proc / buddyinfo. 我想知道是否有任何最佳方式 (不仅是团队 CLI 因此,任何程序或理论基础都是合适的。), 看看它。
已邀请:

龙天

赞同来自:

我回答了

标签。 我的回答只有疑虑

Linux

.

是的,巨大的页面更容易破碎。 有两种类型的内存:一个得到你的进程的内存 (虚拟的), 和内核管理的第二个 ​​(真实的). 任何页面都越多,将越困难分组 (拯救) 她的邻居,特别是当您的服务在一个系统中工作时,也应该支持他人,这是默认分配的,并且写入比其实际最终使用的内存更多。

显示核心 (真实的) 提供的地址是私密的。 有一个非常好的原因,为什么用户空间看到它们代表内核,因为内核应该能够覆盖,而不会使用户空间困扰。 你的过程变得美丽,连续

"迪士尼菲丁"

地址空间在哪个空间,不关注实际内核的内容

制作

与幕后的内存。

您看到长期工作服务器的性能降低的原因可能与未明确阻止的专用块相关联 (例如,

mlock()

/

mlockall()

或者

posix_madvise()

) 并且很长一段时间没有改变,是

卸下

, 这意味着当您需要读取时,您的服务正在移动到磁盘。 更改此行为使您的进程变得如此

坏邻居

, 这么多人将DBMS放在完全不同的服务器上 web / php / python / ruby ​​/ 别的东西。 修复它的唯一合理方式。 - 减少相邻块的竞争。

碎片真的很明显 (大多数情况下), 什么时候 A 在内存中,页面 B 移动到滑动。 当然,你的服务重启看似“痊愈”它,但只因为内核尚未能够带来这个过程 (现在) 其过度固定系数内的新隔离块。

事实上,重启 (让我们说) 'apache' 具有高负载,很可能会将属于其他服务的块直接发送给磁盘。 所以是的 apache 可以改善短时间,但是 mysql 可能会受苦 ... 至少,只要内核导致它们同样地遭受,即时不够物理内存。

添加更多内存或划分苛刻

malloc()

用户 :) 这不仅仅是您需要观看的碎片。

尝试

vmstat

概述实际存储的内容。

裸奔

赞同来自:



要获取当前的碎片索引,请使用:

sudo cat /sys/kernel/debug/extfrag/extfrag_index

要对内核的内存进行碎片整理,请尝试执行:

sysctl vm.compact_memory=1  

您还可以禁用透明的巨大页面 (也被称为 THP) 和 / 或禁用播客 (或减少

swappiness

).

用户空间

为了减少用户空间碎片,可以尝试另一个分销商,例如

jemalloc

(他很棒
https://github.com/jemalloc/je ... stics
, 什么会给你一个想法经销商的内部碎片).

您可以切换到可自定义 malloc, 用它重新编译您的程序或用来运行您的程序

LD_PRELOAD

:

LD_PRELOAD=${JEMALLOC_PATH}/lib/libjemalloc.so.1 app

(谨防
https://www.digitalocean.com/c ... tors/
)

虽然它与内存碎片有点无关 (但与密封相关联 / 迁移内存), 您可能希望运行您服务的多个实例,每个节点 NUMA, 并将它们绑在一起

numactl

.

卫东

赞同来自:

使用庞大页面不应导致内存的额外碎片 Linux; Linux 支持整体内存的庞大页面 (穿过 shmget 或者 mmap), 使用系统管理员必须专门请求和突出显示使用的任何巨大页面。 发现内存,它们是固定的,没有卸载。 在碎片的碎片面前跳过巨大页面的问题正是为什么它们保持在内存中 (突出显示巨大的页面尺寸 2 MB内核应该找到 512 邻近的免费页面 4 KB,可能甚至不存在).

文档 Linux 在巨大的页面上:
http://lwn.net/Articles/375098/
有一种情况,内存碎片可能导致庞大页面的缓慢分配。 (但不是庞大的页面

原因

记忆碎片), 这是如果您的系统配置为增加应用程序请求上的庞大页面的池。 如果一个 / proc / sys / vm / nr_overcommit_hugepages 多于 / proc / sys / vm / nr_hugepages, 这可能发生。

詹大官人

赞同来自:



/proc/buddyinfo

什么是非常有用的。 它更有用的是,具有美丽的输出格式,例如,这种情况 Python 能够:

https://gist.github.com/labeneator/9574294
对于巨大的页面,您需要免费碎片 2097152 (2 MB.) 或者更多。 对于透明的巨大页面,它会在内核请求某些时会自动缩小,但如果您想查看您可以获得多少,代表运行 root:

echo 1 | sudo tee /proc/sys/vm/compact_memory

此外,是的,巨大的页面会导致碎片发生很大问题。 或者你无法获得巨大的页面,或者他们的存在使内核花费很多额外的时间试图得到它们。

我有一个适合我的解决方案。 我在多台服务器上使用它以及我的笔记本电脑。 它适用于虚拟机。

添加

kernelcore=4G

在内核的命令行中 Linux. 在我的服务器上我使用 8G. 要小心数字,因为它会阻止您的内核突出显示此内存之外的任何内容。 需要许多套接字缓冲区或从磁盘运行流到数百个磁盘的服务器不会有此类限制。 任何必须“inshrined”的内存分配 slab 或者 DMA, 指这个类别。

所有内存的所有内存都变成了“移动”,这意味着它可以被挤压成漂亮的碎片,以突出巨大的页面。 现在透明的巨大页面可以真正起飞并根据需要工作。 当内核需要更多时 2M 页面,它可以重新分配页面 4K 到另一个地方。

而且我并不肯定它是如何用零复印的直接介绍进行交互。 “移动区域”中的内存不应固定,但直接I / O请求将特别适用于此 DMA. 他可以复制它。 在任何情况下,它都可以将其固定在可移动区域中。 无论如何,它可能不是您所需要的。

要回复问题请先登录注册