假设我有 1GB RAM 的 Ubuntu,我需要在同一台机器上memcached
运行redis
的使用率 memcached
相当高(例如每秒读取 1K 次),而 redis 的使用率较低(但仍然每秒读取 10 次)。
因为我的机器是 SSD 驱动的,所以我在想,让它memcached
在真实内存上运行,让它 redis
在虚拟内存上运行,可能吗?(因为在我的用例中内存只有 1GB,我想为 memcached 分配更多,为 redis 分配更少,因为我认为在 SSD 驱动的磁盘上,每秒 10 次读取已经足够了)。
有什么办法可以解决这个问题吗?
答案1
您没有意识到这一点,但实际上您已经在为所有这些进程使用虚拟内存了。实际上,默认情况下,Linux 内核将允许进程使用比map
系统上可用的内存更多的内存。大多数内存都没有被积极使用,因此技巧是使用虚拟内存。
Linux 内核采用了这个巧妙的技巧,允许进程映射它们所需的内存,甚至比系统拥有的内存还要多。
例如,当进程请求 1 GB 内存时,内核会说,好的,这是您的 1 GB 地址空间。进程不会使用全部 1 GB,而是使用 100 MB,因此内核知道只使用了 100 MB,它会说;好的,这 100 MB 将存储在 RAM 中;但其他 900 MB 我会考虑在将来使用,这样一来,其他进程就可以请求更多内存,而不管您实际只有 1 GB。
在某些时候,如果进程检查出过多内存;如果内存储备变低,内核会使用启发式方法来计算压力,它会尝试释放一些内存段。简而言之,选项是删除一些由文件系统支持的内存段(加载到内存中的文件),将一些暂时未使用的内存部分移动到“交换”(终止磁盘 IO)
在您的示例中,您可以轻松地为 memcache 分配 32 MB 内存,为 redis 分配 32 MB,密切关注 memcache 中每个 slab 的内存使用情况。Redis 也会对 32 MB 感到满意,直到它使用完所有 32 MB 时,它开始检查内存中使用最少的内容以将其逐出(取决于 redis 的使用情况)
内存缓存要记住的事情。
总 memcache 内存被分成 X 个大小相等的部分。每个部分都会被调用,slab
并容纳核心价值一定尺寸范围的对。
有些slabs
可能是满的;有些可能是空的;这取决于存储在 memcache 中的值的大小。没有办法静态定义 slab 的大小以及它将保存的值的范围。
一旦数据进入 memcache slab,它将被驱逐,无论是在它的生命周期到期时,还是在 slab 已满时,为了在 slab 中容纳新的键值对,最少使用的键值对需要被推出
您需要检查您的 memcache 统计数据,如果您没有进行多次驱逐,那么您不需要增加 memcache 的内存限制,因为它运行良好,并且您提到的命中数也很高,因为这些命中是从内存中提供的;而不是来自某些速度较慢的数据源的数据库。