Linux shmmax 和 shmall - 如何设置正确的单位?
Posted
技术标签:
【中文标题】Linux shmmax 和 shmall - 如何设置正确的单位?【英文标题】:Linux shmmax and shmall - how to set correct unit? 【发布时间】:2019-03-16 00:23:33 【问题描述】:我有一台内存为 16 GB 的服务器。
现在我需要设置我的shmmax
和shmall
,因为服务器默认是(检查ipcs -l
)
------ Messages Limits --------
max queues system wide = 32000
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509465599
max total shared memory (kbytes) = 18014398509465599
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 32000
max semaphores per array = 32000
max semaphores system wide = 1024000000
max ops per semop call = 500
semaphore max value = 32767
看起来很糟糕,shmall
和 shmmax
比我的 16 GB 还大。
所以我想把设置改成
shmmax -> 16GB/4
shmall -> 16GB/2
但我不能确定我设置了什么单位
shmmax --> 4420960256
shmall --> 8620960256
但是我的号码是单位吗?字节还是 KB?
因为ipcs -l
显示的是 KB....
echo "kernel.shmmax=4420960256" >> /etc/sysctl.conf
echo 4420960256> /proc/sys/kernel/shmmax
echo "kernel.shmall=8620960256" >> /etc/sysctl.conf
echo 8620960256> /proc/sys/kernel/shmall
感谢您的帮助,但是 postgresql 昨天刚刚崩溃并被杀死,它显示:
This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 4420960256 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
我的设置 =>
shared_buffers = 4GB
effective_cache_size = 12GB
【问题讨论】:
【参考方案1】:只需使用:
lsipc
在我的 Ubuntu 16.04 LTS 上,我得到:
RESOURCE DESCRIPTION LIMIT USED USE%
MSGMNI Number of message queues 32000 0 0.00%
MSGMAX Max size of message (bytes) 8192 - -
MSGMNB Default max size of queue (bytes) 16384 - -
SHMMNI Shared memory segments 4096 20 0.49%
SHMALL Shared memory pages 2097152 4915 0.23%
SHMMAX Max size of shared memory segment (bytes) 4294967296 - -
SHMMIN Min size of shared memory segment (bytes) 1 - -
SEMMNI Number of semaphore identifiers 128 0 0.00%
SEMMNS Total number of semaphores 32000 0 0.00%
SEMMSL Max semaphores per semaphore set. 250 - -
SEMOPM Max number of operations per semop(2) 100 - -
SEMVMX Semaphore max value 32767 - -
它清楚地说明了我在/etc/sysctl.conf
中指定的值的度量单位。所以对我来说,SHMMAX 以字节为单位,而 SHMALL 以页面为单位(请参阅getconf PAGE_SIZE
)。
【讨论】:
【参考方案2】:让设置保持原样 - 从本质上讲,这在您的情况下意味着“无限制”。少一个你可以撞到头的极限!
PostgreSQL 分配的共享内存量是固定的,主要由shared_buffers
决定。只要确保您没有将其设置为超过您的 RAM(4GB 将是完美的),并且没有任何危险。
记录一下:在我的系统上的实验表明kernel.shmmax
的单位是字节,而kernel.shmall
的单位是内存页(检查getconf PAGESIZE
)。
【讨论】:
以上是关于Linux shmmax 和 shmall - 如何设置正确的单位?的主要内容,如果未能解决你的问题,请参考以下文章
Linux内存管理-内核的shmall和shmmax参数(性能调优)(转)