有没有办法告诉 Linux 它不应该将特定进程的内存交换到磁盘?

它是一个 Java 应用程序,所以理想情况下我希望有一种方法可以从命令行执行此操作。

我知道您可以将全局交换性设置为 0,但这明智吗?

有帮助吗?

解决方案

可以通过 mlockall用于(2)要这样做Linux下的系统调用;这会为整个过程,但是手头了解你需要传递的参数。

你真的需要拉核心的整个事情?如果它是一个Java应用程序,你大概会锁定在核心的整个JVM。我不知道这样做的命令行方式,但你可以写一个简单的程序来调用fork,叫mlockall,然后exec

您也可以看看,如果在由madvise(2)满足您的需求。建议一个更好的分页策略VM子系统可以先制定出更好的,如果它是适用于你。

请注意SunOS中的很长一段时间以前的事了,有类似的机制的madvise叫的 vadvise(2)

其他提示

如果您希望改变swappiness一个过程把它添加到一个cgroup中和该cgroup中设置的值:

https://unix.stackexchange.com/questions/10214/per -Process-swapiness换的Linux#10227

您可以做到这一点通过系统调用的 m锁家庭。我不知道,但是,如果你能为不同的工艺做到这一点。

作为超级用户,您可以“好”它来最高优先级-20,并希望这足以防止它被交换出去。它通常是。正数较低的调度优先级。普通用户不能很好向上(负号)

存在一类您永远不希望它们交换的应用程序。其中一个类就是数据库。数据库将使用内存作为其磁盘区域的缓存和缓冲区,并且将它们进行交换绝对没有意义。特定存储器可能保存一些一周内不需要的相关数据,直到有一天客户需要时才需要。如果没有缓存/交换,数据库只需在磁盘上查找相关记录,这会非常快;但通过交换,您的服务可能会突然需要很长时间才能响应。

mysqld 包含使用操作系统/系统调用的代码 memlock. 。在 Linux 上,从 2.6.9 起,此系统调用将适用于具有 CAP_IPC_LOCK 能力[1]. 。使用时 memlock(), ,该过程仍然必须在范围内进行 LimitMEMLOCK 限制。 [2]. 。(少数)好事之一 systemd 是你可以授予 mysqld 处理这些功能,不需要特殊的程序。如果还可以按照您的预期设置 rlimits ulimit. 。这是一个 override 归档 mysqld 它执行必要的步骤,包括数据库等流程可能需要的其他一些步骤:

[Service]
# Prevent mysql from swapping
CapabilityBoundingSet=CAP_IPC_LOCK

# Let mysqld lock all memory to core (don't swap)
LimitMEMLOCK=-1 

# do not kills this process if low on memory
OOMScoreAdjust=-900 

# Use higher io scheduling
IOSchedulingClass=realtime    

Type=simple    
ExecStart=
ExecStart=/usr/sbin/mysqld --memlock $MYSQLD_OPTS

笔记 标准社区 mysql 当前附带 Type=forking 并添加 --daemonize 在服务选项中 ExecStart 线。这本质上不如上述方法稳定。

更新 我对这个解决方案并不是 100% 满意。经过几天的运行,我注意到该进程仍然有大量的交换!正在检查 /proc/XXXX/smaps, ,我注意到以下几点:

  • 交换的最大贡献者来自堆栈段! 437MB 和波动。这带来了明显的性能问题。它还指示基于堆栈的内存泄漏。
  • 零锁定页面. 。这表明 memlock MySQL(或 Linux)中的选项已损坏。在这种情况下,这并不重要,因为 MySQL 无法内存锁堆栈。

除了在极其特殊的情况下,问这个问题意味着,你这样做是错误的(TM)。

说真的,如果Linux的要交换和你要保持你的进程在内存中,然后你把OS上的不合理的要求。如果你的应用是重要的,然后1)购买更多的内存,2)从机器上卸下其他应用程序/守护程序,或奉献一台机器到您的应用程序,和/或3)投资于一个非常快的磁盘子系统。这些步骤是合理的一个重要应用。如果你不能证明他们,那么你可能无法自圆其说布线内存,要么挨饿等工序。

为什么要这么做呢?结果 如果你想提高这个应用程序的性能,那么你很可能在错误的轨道上。 OS将换出一个进程,以增加内存磁盘缓存 - 即使有免费的RAM,内核知道最好的(actauly的SAMRT家伙写的调度知道最好的)结果。 如果您有需要响应的过程(它的交换出去,而没有使用,你需要它来快速重新启动),那么漂亮的它高优先级,m锁,或者使用实时内核可能有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top