如何分配一个";“内存优先级”;到linux进程?

如何分配一个";“内存优先级”;到linux进程?,linux,memory-management,swap,cgroups,Linux,Memory Management,Swap,Cgroups,我在一个小型OpenWRT路由器上运行tor,由于可用ram(32mb)有限,无法避免交换 大多数情况下,路由器不做任何其他事情,但有时也会访问路由器上运行的postgresql数据库。由于tor不断运行,postgresql完全被替换掉,最初的几次访问具有很高的延迟,这是不好的,因为它是一个交互使用的系统 我已经给postgres分配了一个很好的值-15,给tor分配了+15,但它似乎对内存管理没有太大影响。全局设置swappiness=1也不会改变任何事情,因为无法避免交换,而且因为post

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

大多数情况下,路由器不做任何其他事情,但有时也会访问路由器上运行的postgresql数据库。由于tor不断运行,postgresql完全被替换掉,最初的几次访问具有很高的延迟,这是不好的,因为它是一个交互使用的系统

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

有没有什么方法可以让Linux进程获得内存优先级? 我查看了特定于cgroup的交换性,但是我发现的唯一描述是它影响了页面缓存与交换的决策

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

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

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

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

即,您可以执行以下操作:

#!/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就可以在您已经缓存了结果的情况下进行交换。

您可以使用,更可能在您的程序中使用(可能是Postgresql)

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


可能是相关的(但我想不是)。

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

列出了许多影响其资源使用的选项


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

>严格地说,在Linux中,你不能阻止进程交换出去……你可以,只要用正确的参数调用mlock,进程就会被固定在内存中。感谢守护进程的想法-这就是我目前所做的,导致postgres定期交换入/出。我想实现的是,postgresql的优先级比其他程序低。是的,你可以使用mlock,但在这种情况下,你必须修改postgres的源代码,这不是一件容易的事情。你说的sqlite是什么意思?据我所知,sqlite既不运行守护程序,也不提供tcp/ip服务。