Для прокси действительно ли полезно буферизовать меньше данных, чем Linux, RCVBUF может?

djvused -e n file.djvu

(из http://djvu.sourceforge.net/, пакет djvulibre-bin на Debian и производные).

1
08.12.2014, 12:12
1 ответ

Я столкнулся с той же проблемой и закончился , написав это , чтобы сделать это безболезненно в разных системах (Debian, Ubuntu):

Run make_chroot_initrd Скрипт для создания нового образа initrd с поддержкой Chroot с существующей:

#  ./make_chroot_initrd /chroot/trusty/boot/initrd.img-3.13.0-32-generic
making new initrd: /chroot/trusty/boot/initrd.img-3.13.0-32-generic.chroot

Новое изображение будет точно так же, кроме теперь он может обрабатывать Chroot = Параметр загрузки.

С GRUB2 в качестве загрузчика вы можете добавить запись в /boot/grub/grub.cfg :
(или, возможно, лучше /etc/grub.d/40_custom )

menuentry "ubuntu trusty, (linux 3.13.0-32) (chroot)" {
    insmod ext2                       # or whatever you're using ...
    set root='(hd0,7)'                # partition containing the chroot
    set chroot='/chroot/trusty'       # chroot path
    linux   $chroot/boot/vmlinuz-3.13.0-32-generic root=/dev/sda7 chroot=$chroot rw
    initrd  $chroot/boot/initrd.img-3.13.0-32-generic.chroot
}

(изменение файлов / разделов, чтобы соответствовать вашим)

System Share Install

, как только вы довольны этим, вы можете сделать изменения постоянными
(до тех пор, пока пакет initramfs-tools не обновляется).
В системе Chrooted:

# cd /usr/share/initramfs-tools
# cp -pdrv .  ../initramfs-tools.orig       # backup
# patch -p1 < path_to/boot_chroot/initrd.patch
# rm *.orig */*.orig
# update-initramfs -u

Теперь на регулярном изображении initrd поддержит загрузку Chroot.
Нет необходимости использовать отдельный initrd.chroot, который может выйти из синхронизации с ней.

См. boot_chroot для деталей.

-121--32749-

Я сделал несколько проверок, и кажется, что ядро ​​выделяет довольно большой RCVBUF (буфер получения) около 1-4 МБ.

Не по умолчанию это не так. Размер находится на гнездо; HTTP-зависимости могут включать несколько сокетов. Там нет максимум системы, насколько я знаю, за исключением до сих пор, как есть (довольно высокое) максимальное количество розетков. Из Man 7 Socket :

SO_RCVBUF

устанавливает или получает максимальный буфер приема розетки в байтах. Ядро удваивает это значение (чтобы Разрешить пространство для подразделения бухгалтерии), когда он установлен с помощью Setsockopt (2), и это удвоилось Значение возвращается gethockopt (2). значение по умолчанию устанавливается / proc / sys / net / core / rmem_default файл, и максимально допустимое значение установлено / proc / sys / net / core / rmem_max файл. Минимальное (удвоенное) значение для этой опции составляет 256.

Для меня это:

> cat /proc/sys/net/core/rmem_default
212992

208 КБ. Однако это на самом деле варьируется по протоколу. Из MAN 7 TCP :

TCP_RMEM (поскольку Linux 2.4)

Это вектор из 3 целых чисел: [MIN, по умолчанию, MAX]. Эти параметры используются TCP для регулирования размеров буферов приема. TCP динамически регулирует размер буфера приема от По умолчанию перечислены ниже, в диапазоне этих значений в зависимости от памяти доступной в системе.

Мин: Минимальный размер буфера приема, используемый каждым гнездом TCP. Значение по умолчанию размер системы. (В Linux 2.4 значение по умолчанию 4K, снижена на Page_size Байты в системах с низким памятью.) Это значение используется для обеспечения того, чтобы во время давления памяти Режим, распределения ниже этого размера все равно добиваются успеха. Это не используется для связания Размер буфера приема объявлена ​​с помощью SO_RCVBUF на розетке.

По умолчанию: Размер по умолчанию из получаемого буфера для разъема TCP. Это значение перезаписывает Начальный размер буфера по умолчанию из общего глобального net.core.rmem_default для всех протоколов. Значение по умолчанию составляет 87380 байтов. (На Linux 2.4 это будет снизил до 43689 в системах с низким уровнем памяти.) Если более крупные размеры буфера приема Желаемое, это значение должно быть увеличено (повлиять на все розетки). Использовать большие Windows TCP, Net.ipv4.tcp_window_scaling должен быть включен (по умолчанию).

Макс.: Максимальный размер буфера приема, используемый каждым гнездом TCP. Это значение не Переопределить глобальную net.core.rmem_max. Это не используется для ограничения размера Получаемый буфер объявлен с помощью SO_RCVBUF на розетке. Значение по умолчанию рассчитывается с использованием формулы

  MAX (87380, мин (4 МБ, TCP_MEM [1] * PAGE_SIZE / 128))
 

(на Linux 2.4 по умолчанию используется 87380 * 2 байта, снижена до 87380 в системах с низким памятью).

Это значение сообщается в / proc / sys / net / ipv4 / tcp_rmem :

> cat /proc/sys/net/ipv4/tcp_rmem
4096    87380   6291456

, который можно подтвердить с небольшим количеством C создание одного разъема TCP:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdio.h>

int main (int argc, const char *argv[]) {
    int rcvbufsz;
    socklen_t buflen = sizeof(rcvbufsz);
    int fd = socket(AF_INET, SOCK_STREAM, 0);

    if (fd == -1) {
        perror("socket() failed");
        return 1;
    }

    if (getsockopt (
        fd,
        SOL_SOCKET,
        SO_RCVBUF,
        &rcvbufsz,
        &buflen
    ) == -1) {
        perror("getsockopt() failed");
        return 1;
    }

    printf("SO_RCVBUF = %d\n", rcvbufsz);

    return 0;
} 

Compicied и Runt SO_RCVBUF = 87380 , который соответствует фигуру из / proc . Тем не менее, nginx свободен настроить это вверх, не превышает / proc / sys / net / core / rmem_max ,который, вероятно, снова 208 КБ.

Немного о том, как TCP «динамически регулирует размер буфера приема по умолчанию [...] в зависимости от памяти, доступной в системе» (из человек 7 TCP ) также стоит редактировать.

Теперь к мясу вашего вопроса ...

Так как прокси будет буфер меньше данных, чем ядро, я не вижу, как это помогает справиться с медленными клиентами. Что могут быть преимущества явно реализации / позволяют функцию буферизации в прокси, когда ядро ​​достаточно для нас?

Имейте в виду, что буфер, обсуждаемый выше, не является буфером пользователя. Приложения, как правило, не делают ничего общего напрямую, хотя именно там происходит данные. Таким образом, данные в собственном буфере Nginx не одновременно в буфере ядра . Это читается из этого. Чтение опустошает буфер. Таким образом, это в результате увеличивается количество буферизованных данных на 8 * 8 = 64 КБ.

1
27.01.2020, 23:51

Теги

Похожие вопросы