禁止memcached使用SWAP

我对memcached不是很熟悉,只会基本的使用,但常听到人们讨论memcached使用SWAP的问题。一种说法是memcached使用SWAP可能会导致memcached拒绝连接,对此我不太了解,也无法理解:SWAP对应用程序来说应该是透明的,不应该导致程序出现异常反应。但SWAP导致memcached响应变慢,那是板上钉钉的事实。有些人为了防止memcached使用SWAP,在系统中禁止SWAP,造成系统内存不足时宕机,真是得不偿失。我不太同意在系统中禁用SWAP、或者是把SWAP设置得很小的做法。SWAP导致程序运行变慢,但总比程序不能运行或系统崩溃要好。
其实在linux系统中,可以使用mlockall系统调用阻止程序使用SWAP:

mlock() and mlockall() respectively lock part or all of the calling process's virtual address space into RAM, preventing that memory from being paged to the swap area.

按理说只要在memcached进程内调用mlockall,memcached就不会使用到SWAP。grep一下memcached源码就知道memcached有使用mlockall,但必须在启动时加上-k参数:

int main (int argc, char **argv) {
  bool lock_memory = false;
  ......
  while (-1 != (c = getopt(argc, argv, ......)) {
    switch (c) {
    ......
    case 'k':
      lock_memory = true;
      break;
    ......
    }
  }
  ......
  if (lock_memory) {
    int res = mlockall(MCL_CURRENT | MCL_FUTURE);
  ......
}

从memcached的帮助可以看到-k参数的说明:

-k Lock down all paged memory. This is a somewhat dangerous option with large caches, so consult the README and memcached homepage for configuration suggestions.

帮助说明memcache已经提供了禁止程序使用SWAP的功能,只需加参数-k即可启用。具体情况我没有深入研究、也没有实验过(验证这个问题挺麻烦的),有需要的朋友可研究一下。

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 66 queries in 1.060 seconds