• linux IPC消息队列 的内核限制


    转自:http://blog.csdn.net/xiaofei0859/article/details/5868478

    几乎所有的 Linux 发行版本都包含 ipcs 命令,该命令可以提供当前加载到系统上的
    IPC 资源信息。通过 ipcs 可以确定系统的当前 IPC 限制,还可以检查系统当前使用的上述
    三类IPC资源的状态。例如,假若应用程序启动失败,可以检查系统上的 IPC使用情况来
    判断是否已超出了某个IPC限制。为了确定系统的IPC资源状态,可以在 root用户权限下
    执行带有-u 选项的 ipcs 命令。
    # ipcs -u

    ------ Shared Memory Status --------
    segments allocated 32
    pages allocated 2361
    pages resident 253
    pages swapped   982
    Swap performance: 0 attempts     0 successes

    ------ Semaphore Status --------
    used arrays = 128
    allocated semaphores = 256

    ------ Messages: Status --------

    allocated queues = 0
    used headers = 0
    used space = 0 bytes
    对于“ipcs -u”命令所显示的IPC资源,如果要确定其限制,可以使用“ipcs -l”命令:
    # ipcs -l

    ------ Shared Memory Limits --------
    max number of segments = 4096
    max seg size (kbytes) = 32768
    max total shared memory (kbytes) = 8388608
    min seg size (bytes) = 1

    ------ Semaphore Limits --------
    max number of arrays = 128
    max semaphores per array = 250
    max semaphores system wide = 32000
    max ops per semop call = 32
    semaphore max value = 32767

    ------ Messages: Limits --------
    max queues system wide = 16
    max size of message (bytes) = 8192
    default max size of queue (bytes) = 16384
    上述输出表明,该系统已经到达信号量数组(或信号量集合)的数目上限。这个限制可
    以通过增加内核参数 semmni 的取值来解决,该参数定义了系统能够拥有的信号量集合的
    总数。Linux 可以动态调整大多数内核IPC 参数值的大小,也可以静态地修改

    消息队列为进程提供了一种异步传递消息的方法。在使用 msgget()建立了一条消息队
    列之后,发送进程和接收进程就可以通过这条消息队列交换消息。发送进程将消息发送到
    指定的消息队列,而接收者试图从指定的消息队列中获取消息。如果该队列中没有消息的
    话,则接收者根据自己是否要等待的意愿而阻塞或返回某个标志。
    表 13-2 简要描述了在当前Linux 2.4/2.6 内核实现中提供的3 个消息队列参数。
    表 13-2 与消息队列相关的内核参数
    名    称 描    述 默 认 值 最 大 值
    msgmni 最大消息队列数 16 2GB
    msgmax 最大消息长度(字节数) 8192 2GB
    msgmnb 消息队列中的最大字节数 16384 2GB

    注意,第 4 列中给出的最大值取决于数据类型。上述 3 个内核参数都是 int 类型,因
    此在32 位Intel 机器上,硬性上限是2GB。
    Linux 还定义了其他当前未用的消息队列相关参数。
    以下各节具体分析与消息队列相关的参数

    13.5.1 msgmni
    msgmni 定义了系统范围内的消息队列上限。与信号量一样,消息队列也拥有一个相关
    的标识符。在系统初始化阶段里,内核创建一个指向消息队列标识符结构的指针数组。该
    数组的项数由 msgmni确定。对于每个消息队列,Linux 内核为标识符分配44B,为消息队
    列数据结构分配 96B。为了获得更多的消息队列资源,可以动态增加 msgmni 取值。和信
    号量一样,消息队列标识符的最大数目也受限于IPCMNI。msgmni的默认上限为 16B,这
    可能不足以保证一些大型数据库应用平滑地运行。如果在系统上要运行数据库应用的话,
    推荐默认上限值是 128B。
    13.5.2 msgmax
    msgmax 限制进程可以发送的消息长度。该参数由 Msgsnd()函数加以应用。如果待发
    送消息的长度超过该值,则返回一个错误。该参数可以在运行时调整

    13.5.3 msgmnb
    msgmnb 确定一个消息队列的容量。该参数的取值存储在消息队列标识符结构的某个
    域中,用于确定是否存在着对新消息进行排队的空间。msgmnb 值可以动态修改,默认为
    16384。修改其取值会影响到所有新的消息队列的容量。用户可以通过 Msgctl()系统调用来
    增加现有消息队列的容量

    修改消息队列的参数

    1.永久修改
    root用户下修改/etc/sysctl.conf 文件。

    2.临时修改
    root用户下sysctl -w kernel.msgmnb= 1048576

  • 相关阅读:
    索引的实现:B+树
    SQL Server 查
    SQL Server 增、删、改、小部分查
    最最最最最基础的SQL Server
    三大范式
    SQLserver数据类型
    第一阶段项目
    2017.10.17一阶段项目心得
    jquery&bootstrap
    国庆小长假结束后的一阶段小测验
  • 原文地址:https://www.cnblogs.com/langqi250/p/2782544.html
Copyright © 2020-2023  润新知