>系列的Ubuntu 14.04.5(x86_64)服务器,不断更新
>我的应用程序需要增加postgres的堆栈深度
>我在/etc/security/limits.d/myapplication.conf中创建了一个文件
> myapplication.conf文件包含以下行:* – stack 131072
>注意131072KB == 128MB
>制作此myapplication.conf文件后,我的ulimit -s返回:131072
>然后我编辑了我的/etc/postgresql/9.3/main/postgresql.conf文件并添加了以下行:max_stack_depth = 126MB
我的问题
在引导期间,将显示以下消息:
* The Postgresql server Failed to start. Please check the log output: 2018-01-24 09:27:53 MST LOG: invalid value for parameter "max_stack_depth": 129024 2018-01-24 09:27:53 MST DETAIL: "max_stack_depth" must not exceed 7680kB. 2018-01-24 09:27:53 MST HINT: Increase the platform's stack depth limit via "ulimit -s" or local equivalent. 2018-01-24 09:27:53 MST FATAL: configuration file "/etc/postgresql/9.3/main/postgresql.conf" contains errors * Starting Mount network filesystems [ OK ] * Starting Postgresql 9.3 database server * Stopping Mount networ[ OK ]systems [fail]
这反过来导致我的应用程序服务失败,因为我依赖于我的数据库.启动后,如果我启动postgres服务,那很好:
dev@wipn:~$sudo service postgresql start * Starting Postgresql 9.3 database server [ OK ] dev@wipn:~$
我的猜测是/etc/security/limits.d/myapplication.conf的效果仅适用于我的系统尝试启动postgres之后的启动阶段.所以,也许一个明显的解决方案是在我开始postgres时改变,那很好,我可以处理.
我的问题
有什么方法可以改变内核的堆栈深度,这样我只需要对服务器进行最小的改动?
我想要尽可能干净的东西.我希望它能够承受升级,最好适用于其他发行版.我通过Ansible戏剧管理我的东西,所以我宁愿为此写一个干净的游戏.
可能只是改变我的服务的开始顺序是最好的分辨率.那里的任何人都知道其他合适的选择吗?
运行我尝试的事物的更新
这是我尝试的一些事情的运行列表,没有成功.
在/etc/security/limits.d/myapplication.conf中:
> postgres – stack 131072
> * – 堆栈131072
root – stack 131072
背景
似乎对/etc/security/limits.*的更改从不影响服务,而是从shell执行的东西.所以,这种使我在/etc/security/limits.*中的变化毫无意义. (在这里插入诅咒).我现在删除了我的/etc/security/limits.d/myapplication.conf.
更改postgres的堆栈大小限制
我编辑了我的“/usr/share/postgresql-common/init.d-functions”,特别是start()函数,显示为:
... # start all clusters of version $1 # output according to Debian Policy for init scripts start() { ulimit -s 131072 #JTS: To avoid Issue #XYZ # create socket directory if [ -d /var/run/postgresql ]; then chmod 2775 /var/run/postgresql else ...
显然我已经添加了ulimit行.修改此文件对我来说很恶心,因为我希望它会被更新永久更改.至少我有一个Ansible规则来强制它存在.
我的Ansible解决方案
这是我为了强制执行此配置更改而创建的Ansible任务:
- blockinfile: dest: /usr/share/postgresql-common/init.d-functions block: | ulimit -s 131072 backup: yes insertafter: '^start\(\) \{' state: present
这个Ansible任务导致函数看起来像这样:
... # start all clusters of version $1 # output according to Debian Policy for init scripts start() { # BEGIN ANSIBLE MANAGED BLOCK ulimit -s 131072 # END ANSIBLE MANAGED BLOCK # create socket directory if [ -d /var/run/postgresql ]; then ...
注意:Upstart服务忽略/ etc / security / limits
似乎/etc/security/limits.*被Upstart忽略,Ubuntu 14.04使用它.我的应用程序服务实际上使用了upstart,并且可以为upstart插入一行,如下所示:
limit stack <softlimit> <hardlimit>
Ubuntu在14.04之后切换到systemd,所以这个新贵tid-bit将逐渐淡化为无关紧要.
这与我的问题无关,因为在14.04,postgresql不是由upstart管理的.