Назад | Перейти на главную страницу

Зачем ограничивать общий объем доступной разделяемой памяти?

У меня есть несколько процессов с большой памятью, которые совместно используют память в системе CentOS 7. Подстраиваю под них систему памяти. Для kernel.shmmax и kernel.shmall в документации RedHat указано:

kernel.shmmax определяет максимальный размер в байтах одного сегмента разделяемой памяти, который процесс Linux может выделить в своем виртуальном адресном пространстве.

kernel.shmall устанавливает общий объем страниц разделяемой памяти, которые могут использоваться в рамках всей системы.

Почему существуют такие ограничения на общую память? Я могу ограничить общий объем памяти, который использует пользователь или процесс, с помощью ограничений или контрольных групп. Зачем мне ограничивать общий объем разделяемой памяти, доступной в системе? Снижается ли производительность системы, когда ей нужно управлять большим объемом разделяемой памяти?

Это часть системной гигиены и немного наследия. Элементы управления cgroup относительно новы для Linux (2.6.24 и новее), где shmmax / shmall присутствовали в ядре еще в серии 1.2.x:

ipc/shm.c

    {
            struct shminfo shminfo;
            if (!buf)
                    return -EFAULT;
            shminfo.shmmni = SHMMNI;
            shminfo.shmmax = SHMMAX;
            shminfo.shmmin = SHMMIN;
            shminfo.shmall = SHMALL;
            shminfo.shmseg = SHMSEG;
            err = verify_area (VERIFY_WRITE, buf, sizeof (struct shminfo));
            if (err)
                    return err;
            memcpy_tofs (buf, &shminfo, sizeof(struct shminfo));
            return max_shmid;
    }

Ограничивающая философия linux эволюционировала за последний 21 год. В то время доминировала модель глобальных ограничений. Вы не хотели использовать всю свою оперативную память для IPC, поэтому вам нужно было установить для нее высокую отметку, чтобы обеспечить достаточно места для всего остального. Это также может работать с современными контрольными группами; индивидуальные ограничения для ваших процессов, с глобальным ограничением, чтобы избежать подкачки, и вся система по-прежнему работает хорошо.