linux系统优化措施汇总-持续更新

内存锁定

原理

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);

你可能感兴趣的:(Linux,java,linux)