我们有一个库,它使用 POSIX 消息队列在进程之间传递数据,并且需要将 msgqueue 内核参数设置为无限制,否则进程将返回错误too many open files
。通常我们使用ulimit -q
and来查看/设置它ulimit -q unlimited
,但是对于一些 Kubernetes 容器,我们希望能够通过 go 代码直接设置它。
我们已经确认 pod 规范允许更改 mqueue 设置(通过 Kubernetes 1.14+ 的 securityContext)并且特定容器可以调整资源设置:
...
kind: Deployment
...
spec:
template:
spec:
securityContext:
sysctls:
- name: fs.mqueue.msg_max
value: "10000"
- name: fs.mqueue.msgsize_max
value: "102400"
containers:
- name: testing
securityContext:
capabilities:
add:
- SYS_RESOURCE
...
如果没有这些设置,甚至ulimit -q unlimited
会出现错误:
bash:ulimit:POSIX消息队列:无法修改限制:不允许操作
但是我们如何使用syscall.Setrlimit从我们的代码中调整限制值呢?