Задать вопрос
  • Как держать больше 65535 одновременных TCP соединений?

    xenon
    @xenon
    Too drunk to fsck
    Вы говорите об ограничении в 64k портов. Оно проявляется, например, в том, что вы не сможете на сервере запустить (на одном IP) больше 64k сетевых сервисов. (ssh слушает порт 22, apache слушает 80, mysql слушает 3306) итд. Каждый слушающий сервис идентифицируется по сокету ( IP + порт), IP у вас один, портов 64k, значит, 64k слушающих сокетов.

    А вот для установленных TCP соединений:

    socket
    An address which specifically includes a port identifier, that
    is, the concatenation of an Internet Address with a TCP port.

    connection
    A logical communication path identified by a pair of sockets.

    https://tools.ietf.org/html/rfc793

    То есть, соединение идентифицируется по IP сервера, порт сервера, IP клиента, порт клиента.

    Да и вы сами на любом более-менее активном веб-сервере видите через lsof множество соединений, и они все установлены с одним вашим сокетом (IP:80 или IP:443), но у них разный второй сокет. Если пользователь, например, качает какой-то файл в два потока, будет один коннект: server:80 - client:4444 и еще один коннект: server:80 - client:4445. Это разные TCP соединения.
    Ответ написан
    Комментировать
  • Как держать больше 65535 одновременных TCP соединений?

    В случае входящих соединений, очевидного лимита в 65535 соединений нет, скорей всего вы упретесь в лимит на файловые дискрипторы (сокеты), для каждого соединения нужен сокет. При этом лимиты могут быть на уровне пользовательских лимитов (и надо учесть для сервисов запускаемых через systemd действуют отдельные лимиты, а не те, которые указываются в limits.conf). Обычно по умолчаню лимиты дискрипторов в районе 1024-4096, существенно ниже 65535. Для очень большого количества сокетов необходимо будет так же менять sysctl на максимальное число открытых файлов, а возможно и пересобирать ядро, чтобы обойти заложенные верхние ограничения.

    В случае исходящих соединений, вы кроме сокетов упретесь в нехватку эфемерных портов, для каждого исходящего соединения требуется отдельный эфемерный порт. По умолчанию, их в районе 16k и можно расширить до 63k через соответствующие sysctl. Выше этого значения разрешить нехватку портов можно путем добавления дополнительных IP + в зависимости от системы, может потребоваться установка флагов SO_REUSEADDR/SO_REUSEPORT/SO_PORT_SCALABILITY). Как они действуют, и какие комбинации надо использовать зависит не только от системы,но и от версии ядра, попытка разобрать есть здесь:
    https://stackoverflow.com/questions/14388706/socke...
    Но в случае, если исходящий трафик идет через NAT (в случае виртуализации это почти всегда так), необходимо решать аналогичную проблему на уровне NAT.

    Для очень большого количества соединений вы будете упираться и в другие лимиты - sysbuf'ы, память и другие.
    Ответ написан
    Комментировать
  • Как держать больше 65535 одновременных TCP соединений?

    msHack
    @msHack
    На количество коннектов ограничений нет Это Количество портов 1-65535 ограничения могут быть в роутере,у провайдера,и в операционной системе к примеру процессор и оперативная память роутера не всегда спровляются и с 5000 соединений
    Ответ написан
    Комментировать
  • Как держать больше 65535 одновременных TCP соединений?

    @galaxy
    Поднимаю ещё несколько VPS'ок в качестве «рабочих»

    Несколько - это сколько?
    Есть такой sysctl параметер, как net.ipv4.ip_local_port_range - диапазон портов для клиентских соединений (из этого пула присваиваются порты при открытии нового соединение, в котором машина выступает как клиент). По умолчанию он выглядит как-то так: 32768 60999 (т.е. чуть больше 28к доступных портов). Т.е. два рабочих без настройки 150к коннектов никак не сделают (даже с настройкой, т.к. лимит исходящих соединений к одному IP - 65535).

    Еще есть несколько параметров, которые влияют на очередь обработки исходящих и входящих соединений. Почитать про них и их настройку можно тут (англ) и тут (рус).
    Ну и в статьях, на которые вы сами даете ссылки, есть рекомендации по настройке некоторых параметров (например, ограничения числа файловых дескрипторов).
    Ответ написан
    2 комментария
  • Как удалить все элементы методом remove()?

    Stalker_RED
    @Stalker_RED
    document.queryeSelectorAll('.main-menu__item')
      .forEach(elem => elem.remove());

    В консоли можно вообще так:
    $$('.main-menu__item')
      .forEach(elem => elem.remove());


    А вообще да, массив меняется, потому что
    HTMLCollection, хранящая элементы DOM, является динамической. При изменении документа она моментально отражает все произведённые изменения.


    Можете вместо этого перебирать массив с конца
    for (let i=li.length;i>=0;i--) { ... }
    или вообще, удалять первый элемент пока массив не опустеет
    while(arr.length) arr[0].remove()
    Ответ написан
    Комментировать
  • Почему через VPN некоторые сайты возвращают зловредный (?) скрипт?

    paran0id
    @paran0id
    Умный, но ленивый
    Есть такое дело - диапазоны ip-адресов хостингов, того же DO, находятся в черных списках некоторых сайтов. Защита от ботов, парсеров и нехороших людей. Подмены нет - вы попадаете на тот сервер, на который хотели попасть, просто вместо контента он отдаёт вам заглушку. В некоторых случаях предлагают разгадать капчу.
    Ответ написан
    4 комментария
  • Каковы перспективы Deep Reinforcement learning?

    Zoominger
    @Zoominger
    System Integrator
    Вам - нет.
    Ответ написан
    Комментировать
  • Парсинг первого видео youtube при поиске PYTHON. Как сделать?

    Megum1n
    @Megum1n
    Воспользуйся API, не изобретай велосипед.
    https://developers.google.com/youtube/v3

    Описание метода search:
    https://developers.google.com/youtube/v3/docs/sear...
    Нужно выполнить запрос, который сразу вернёт тебе list с результатами.
    Ответ написан
    Комментировать
  • Фильтрация массива объектом?

    Google MDN Array filter
    Ответ написан
    Комментировать
  • Возможно ли сгенерировать случайную строку в таблице mysql?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Например, так:
    ALTER TABLE `table`
      ADD COLUMN `product_code` VARCHAR(36);
    
    UPDATE `table` SET `product_code` = UUID();
    Ответ написан
    4 комментария
  • Что это за символы? И как это расшифровать?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Это похоже на некую функцию _0x5f17, в которую передаются два строковых значения, внешне похожих на шестнадцатеричные числа, хотя это не обязательно так.
    Похожий код встречается в некоторых JS-обфускаторах.
    Какой язык?
    Ответ написан
    1 комментарий
  • Как в имя свойства подставить переменную?

    FFxSquall
    @FFxSquall
    Могу писать код, могу не писать
    Так arr.push({ [var]: value })
    Ответ написан
    Комментировать
  • Как при помощи выходного тепла ПК расчитать сколько Watt он потребляет?

    Zoominger
    @Zoominger Куратор тега Железо
    System Integrator
    Я думаю, что можно рассчитать потребление в Watt зная изначальные данные скорости вентиляторов, мощности процессора и видеокарты (основные потребители).

    Нет.
    Ну разве что в пределах плюс-минус киловатта.
    Ответ написан
    7 комментариев
  • В чем разница multithreading, multiprocessing и асинхронности?

    Griboks
    @Griboks
    Процессы - это параллельные потоки (нормальные) .
    Потоки (питоновские) - это корутины.
    Корутины - это толпа последовательных потоков.
    Асинхронность - это очередь последовательных потоков.
    Ответ написан
    Комментировать
  • Как получить из массива уникальные значения?

    Fzero0
    @Fzero0
    Вечный студент
    let arr = [
        {car: 'audi' , color: 'red'},
        {car: 'audi' , color: 'black'},
        {car: 'bmv' , color: 'black'},
        {car: 'bmv' , color: 'red'},
        {car: 'mers' , color: 'black'},
    ]
    const unique = (array) => [...new Set(array.map(item => item.car))];
    
    console.log(unique(arr))
    Ответ написан
    Комментировать
  • На какое количество компонентов разбивать приложение на vue?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    • Если какой-то элемент нужно использовать больше одного раза — делайте отдельным компонентом
    • Если ваш родительский компонент очень большой — разбейте его на несколько компонентов поменьше, чисто для удобства
    • Если вы предполагаете, что какая-то часть вашей программы будет часто изменяться — выносите в отдельный модуль.
    • Если у вам большой кусок статического контента — выносите в отдельный компонент
    • Если какой-то элемент имеет в себе очень сложную или затратную по времени логику — выносите в отдельный компонент.


    Вообще, я стараюсь делать много мелких компонентов. Мне так тупо удобнее. Но главное без фанатизма. Вам не нужен отдельный компонент на каждый инпут, разве что у этого инпута должна быть какая-то инкапсулированная логика или оформление.
    Ответ написан
    Комментировать
  • Redis + docker + k8n?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    В хайлоад проектах используются все тебе самые технологии что и не в хайлоад. Просто в других комбинациях и с другой архитектурой
    Ответ написан
    1 комментарий
  • Как выбрать три карточки и заблокировать остальные?

    0xD34F
    @0xD34F Куратор тега JavaScript
    С какими элементами имеем дело, какие классы будем им переключать, как ограничено количество одновременно активных:

    const itemSelector = '.product';
    const activeClass = 'checked';
    const disabledClass = 'unchecked';
    const activeLimit = 3;

    Делегирование, обработчик клика назначаем один раз для всех элементов:

    document.addEventListener('click', e => {
      const cl = e.target.closest(itemSelector)?.classList;
      if (cl && !cl.contains(disabledClass)) {
        cl.toggle(activeClass);
        updateDisabled();
      }
    });
    
    updateDisabled();
    
    function updateDisabled() {
      const [ notActive, active ] = Array.prototype.reduce.call(
        document.querySelectorAll(itemSelector),
        (acc, n) => (acc[+n.classList.contains(activeClass)].push(n), acc),
        [ [], [] ]
      );
    
      const limitReached = activeLimit <= active.length;
      notActive.forEach(n => n.classList.toggle(disabledClass, limitReached));
    }

    Или, назначаем обработчик клика каждому элементу индивидуально:

    const items = [...document.querySelectorAll(itemSelector)];
    let activeCount = 0;
    
    items.forEach(n => n.addEventListener('click', onClick));
    
    updateDisabled(items.filter(n => n.classList.contains(activeClass)).length);
    
    function onClick({ currentTarget: { classList: cl } }) {
      if (!cl.contains(disabledClass)) {
        updateDisabled(cl.toggle(activeClass) ? 1 : -1);
      }
    }
    
    function updateDisabled(change) {
      const limitReached = (activeCount += change) >= activeLimit;
      for (const { classList: cl } of items) {
        cl.toggle(disabledClass, !cl.contains(activeClass) && limitReached);
      }
    }
    Ответ написан
    1 комментарий
  • Стоит бросить чтение книги, если она не совсем понятна?

    Qudenrash
    @Qudenrash
    Возможно дело в том как автор излагает информацию.
    Если по одной и той же теме есть книги разных авторов - я пробую читать другого, с другим стилем изложения и которого я понимаю лучше.
    Ответ написан
    Комментировать