6

我在一个小型 OpenWRT 路由器上运行 tor,由于可用内存有限(32mb),交换无法避免。

大多数时候,路由器不做任何其他事情,但是有时也会访问也在路由器上运行的 postgresql 数据库。由于 Tor 不断运行,postgresql 被完全换出,前几次访问延迟非常高,这很糟糕,因为它是一个交互使用的系统。

我已经为 postgres 分配了一个不错的值 -15,为 tor 分配了 +15,但它似乎并没有对内存管理产生太大影响。全局设置 swappiness=1 也不会改变事情,因为无法避免交换,并且因为 postgresql 大部分时间都没有运行,所以无论如何它都会被交换出去。

有什么办法可以像 Linux 进程的内存优先级一样吗?我查看了 cgroup 特定的交换,但是我发现的唯一描述是它影响决策页面缓存与交换。

我正在寻找的是一个参数来告诉 linux 内核不要像其他进程那样积极地换出 postgresql(但我不想锁定整个进程)。或者为postgresql分配swappiness = 80系统范围和swappiness = 1将postgresql保留在内存中,同时在需要时换出其他所有内容?

4

3 回答 3

3

严格来说,在 Linux 中,您无法阻止进程换出。您可以避免完全使用swapoff -a(并添加一些 RAM)进行交换,但这可能会导致系统不稳定。

但在这种情况下,Linux 做得很好:无论您有多少空闲 RAM,都必须换掉“不时”使用的进程。也许您使用了错误的配置。你可以把 postgres 放在另一台主机上,也许用更快的硬盘?

顺便说一句:如果您想防止在当前配置中换出 postgres 进程,我认为您可以尝试使用类似保持活动状态的东西:让守护进程(或简单的 bash 脚本)定期发送一些查询以让系统看到该进程处于活动状态。

IE 你可以这样做:

#!/bin/bash
DBHOST=localhost
DBPORT=5432
DBNAME=theDBname
DBUSER=theUserName
THEQUERY="SELECT 1"

psql -h $DBHOST -p $DBPORT -d $DBNAME -U $DBUSER  -c "$THEQUERY"

让 cron 每分钟左右调用一次。

如果你想要更复杂的东西,你可以创建一个守护进程来发送一些“真正的”查询并缓存结果,这样 postgres 就可以在你已经缓存结果的时候换掉。

于 2014-08-20T13:08:42.717 回答
2

我认为您应该做的是将 PostgreSQL 配置为使用更少的内存。它使用大量内存来尝试提高性能,但在您的情况下它不起作用。您的 OpenWRT PostgreSQL 安装的默认配置可能已经从其大量的正常默认值中减少了它的内存占用,但看起来您需要更进一步。

PostgreSQL 文档列出了许多影响其资源使用的选项。

如果 StefanoF 和 Basile Starynkevitch 提出的将 PostgreSQL 服务器移动到另一台机器或使用更高效的数据库(如 sqlite)的其他建议失败,则比试图将交换性能从绝对糟糕提高到糟糕的更好的解决方案。

于 2014-08-20T15:17:26.340 回答
1

您可能会在您的程序(可能是 Postgresql)中使用mlock(2),更可能使用madvise(2 )。

但是,我认为 Postgresql(或 Mysql)对于 32 MB RAM 系统来说太大了。你考虑过 sqlite吗?它是一个(不是服务器),您可以链接到您的应用程序,并且您可以使用它在本地 sqlite 文件(充当数据库)上执行 SQL“请求”。当然,您可能需要使您的应用程序能够通过网络进行交互(例如使用 FASTCGI 或使用一些 HTTP 服务器库,如libonion)。

也许ionice(1)可能是相关的(但我猜不是)。

于 2014-08-20T14:37:43.083 回答