内存锁定
原理
linux虚拟内存-swap
当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in
内存锁-mlock、mlockall
内存锁就是将进程的虚拟内存的部分或者全部锁进内存以确保它们总是位于物理内存中,一是可以确保永远不会因为分页故障发生延迟(提升性能),二是敏感数据不会被写入磁盘。
实际应用-elasticsearch memory_lock开关
- 见https://www.elastic.co/guide/en/elasticsearch/reference/current/_memory_lock_check.html
jvm做垃圾回收的时候,它会访问堆中每个page,换出(swapped out)到磁盘上的page不得不重新被加载到内存。这样会在处理请求的基础上,叠加更多的磁盘访问,对系统性能造成影响。
Elasticsearch可以通过系统层面禁用swap或者在进程级别配置bootstrap.memory_lock来实现锁定内存。
实现
jdk本身没有提供锁定内存的api,如果需要锁定内存,可以通过jni去调用linux的api达到目的。下面是elasticsearch的实现
org.elasticsearch.bootstrap.JNANatives
static void tryMlockall() {
int errno = Integer.MIN_VALUE;
String errMsg = null;
boolean rlimitSuccess = false;
long softLimit = 0;
long hardLimit = 0;
try {
int result = JNACLibrary.mlockall(JNACLibrary.MCL_CURRENT);
... ...
}
}
org.elasticsearch.bootstrap.JNACLibrary
static native int mlockall(int flags);
Original: https://blog.csdn.net/shuxiaohua/article/details/127792929
Author: shuxiaohua
Title: linux系统优化措施汇总-持续更新
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/654360/
转载文章受原作者版权保护。转载请注明原作者出处!