Задать вопрос
  • Проседание производительности mariadb, linux. Почему растет Load Average до 30-40?

    @yuriyant Автор вопроса
    web программист
    Всем спасибо за помощь и советы!

    Было сделано сразу две манипуляции способствующие решению проблемы. Какая из них решила проблему точно уже не скажу.

    У Битрикс есть таблица с купонами скидок каталога, в ней у нас было 300 тыс. купонов. Так как изменить запрос нет возможности из-за его системности и обновления Битрикс все затрут, то были проведены тесты с данными. Удаление из таблицы 200 тыс. старых купонов позволило ускорить медленный запрос с ~1.3 сек. до 0.01 сек. В таблице осталось 60 тыс. купонов.
    Будем дорабатывать систему автоматической очистки купонов и писать обращение в Битрикс с просьбой оптимизации запроса. Хотя медленный запрос по данным мониторинга и отрабатывал ~3.7 раз в секунду, но это не мешало ему душить процессор.

    Второе мероприятие это переход с mariadb (10.1, 10.3 - обе версии тестировались по несколько дней) на percona 8. Предположение пало на проблему базы данных с нашим набором данных и запросами, была мысль, а вдруг в перконе знаю и устранили ошибку.

    Я все же полагаю, что ключевой фактор тут был указанный Vitaly Karasik на медленный запрос.
    Видимо на наших данных этот запрос вызывал блокировки и высокую нагрузку на CPU из за повышения значений метрик RW Locks S OS Waits, RW Locks X OS Waits, RW Locks S Spin Rounds, RW Locks X Spin Rounds. Купонов становилось больше и в какой-то момент времени их кол. стало критичным для запроса.

    Плавающий LA независящий от количества запросов к базе данных оказался влиянием вызова заданий по крону на выгрузку в яндекс маркет каталогов. Буду привязывать отображение заданий агентов Бирикс (крон задачи) на графиках, чтобы в будущем более явно строить связи нагрузки и работу приложения.

    UPDATE 09.08.2019

    Базу данных вернул на mariadb 10.3. Выяснился еще один запрос повышающий нагрузку на CPU. У нас около 1 млн. сессий в база данных. Так вот Битрикс в методе Sale\Fuser::getIdByUserId($ID) получения одной записи не выставляет лимит и еще и сортирует всю выборку. Если передается FALSE, то он сортировал в нашем случае около 1 млн. записей + добавлял туда каждый раз еще 1 запись. Обращение в Битрикс отправлено, они его приняли и судя по всему скоро будет выпущено обновление.
    Кому нужно решение сейчас - измените метод прямо в ядре Sale\Fuser::getIdByUserId таким образом.

    $res = FuserTable::getList(array(
                           'filter' => array(
                                   'USER_ID' => $userId
                           ),
                           'select' => array(
                                   'ID'
                           ),
                           'limit' => 1, // Добавить лимит
                           // 'order' => array('ID' => "DESC") // Убрать эту сортировку
                   ));
    Ответ написан
    3 комментария
  • Как несколько Docker контейнеров запускать через Dockerfile (Docker контейнер)?

    tumbler
    @tumbler
    бекенд-разработчик на python
    Но есть проблемы с актуализацией этого файла у конечного пользователя, доставкой, настройкой и версионированием.

    Мне кажется, проще решить проблемы с актуализацией этого файла, чем перепиливать всё на "контейнеры внутри контейнера" на основе Dockerfile: с Docker-in-Docker есть много разных проблем, с которыми часто сталкиваются при эксплуатации gitlab runner. Тут и производительность, и недоступность функционала, и непонятные зависания, и проблемы с местом на диске.
    Ответ написан
    Комментировать
  • Где ошибочка в этой строке?

    WNeZRoS
    @WNeZRoS
    В первом pow не та степень.
    Визуализация выражения
    rbgoxbpbszrkvaiwc7v3hvayljm.png
    Ответ написан
    Комментировать
  • Есть ли возможность накатать абузу на сапорт Hetzner?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Есть такая "бурчательная" соцсеть, на нытьё в которой компании реагируют очень остро - Twitter. На грамотном английском напишите твит о свой проблеме, в котором упомяните @Hetzner_Online и посетуйте на то, что придётся уйти к другому хостеру. Не исключено, что в скором времени вам напишут или реплай или сообщение в директ с обещанием разобраться. Если не откликнутся или таки не разберутся, просто уходите к другому хостеру.
    Ответ написан
    1 комментарий
  • Как удалить определенные символы из строки, включая служебные?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    import string
    
    text = "[('Тестовый текст,)]"
    
    result = ''.join(c for c in text if c not in string.punctuation)

    или более производительный вариант

    t = str.maketrans('', '', string.punctuation)
    result = text.translate(t)
    Ответ написан
    Комментировать
  • Почему Docker Compose не работает?

    Lobotomist
    @Lobotomist
    Software Developer
    Вероятно, вы не установили docker-compose.

    Если же вы это сделали - то напишите команды установки, которые вы выполняли.
    Ответ написан
    1 комментарий
  • Как ускорить rsync?

    Lobotomist
    @Lobotomist
    Software Developer
    В процессе выяснения деталей в комментариях к вопросу было найдено решение.

    В данном случае синхронизация выполнялась без использования опции `--times`, которая сохраняет время модификации файла при синхронизации. При этом не была использована опция `--size-only`, благодаря которой файлы с одинаковыми размерами считаются одинаковыми вне зависимости от времени изменения.
    И получается, что даты изменения у всех уже синхронизированных файлов отличаются, и rsync при повторном запуске считает эти файлы потенциально разными и считает их контрольные суммы, чтобы сравнить их по содержимому. На это и уходило время.

    Добавление опции `--size-only` существенно сократило время анализа файлов перед началом передачи.
    Хотя, на мой взгляд лучше вместо этого по умолчанию всегда использовать `--times` (в том числе в составе `-a`), если возможно.

    Кроме того, была использована опция `-v`, которая выводит информацию о синхронизируемых файлах, что тоже могло замедлять процесс, хотя, скорее всего ,не значительно.
    Ответ написан
    Комментировать
  • Автоматизация развертки настроенной Linux на машины?

    @q2digger
    никого не трогаю, починяю примус
    У меня новый чистый CentOS с паролями, ключами, базовыми настройками сети накатывается с PXE сервера за примерно 4 минуты. Используется kickstart сценарий установки.
    Дальше использую ansible , где указаны специфичные роли для данного хоста. Еще пару минут.
    Если система выкатывается на виртуалке в vSphere , то вообще все делается через Ansible - специальная роль пинает ESX, там взлетает виртуалка, грузится по PXE и смотри выше - kickstart и т.д.
    Ответ написан
    1 комментарий