题
有没有办法告诉 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锁,或者使用实时内核可能有帮助。