是否可以强制特定程序使用虚拟内存?

是否可以强制特定程序使用虚拟内存?

假设我有 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 的内存限制,因为它运行良好,并且您提到的命中数也很高,因为这些命中是从内存中提供的;而不是来自某些速度较慢的数据源的数据库。

相关内容