AstraSerg
Геннадий
Всем привет. Подскажите, пожалуйста, как убрать лишние сообщения в логах? Уже установил logLevel в 0, quiet тоже стоит. У меня множественные коннекты к БД и остался спам сообщения:
mongod[25605]: 2018-07-25T14:38:00.709+0300 I NETWORK [conn1] received client metadata from 127.0.0.1:33528.............
Как это убрать на фиг?
AstraSerg
Геннадий
Это вам в консоль сыпется?
Ну куда настрою, туда и сыпится. И в логфайл сыпалось, сейчас у меня journalctl используется, теперь туда (через syslog).
AstraSerg
> Ну куда настрою, туда и сыпится
Может в /dev/null настроите? Там и места побольше и IO жрать не будет :)
Геннадий
Да я это уже прочитал, и прямо, и задом наперёд. Поэтому и пишу. У меня в результате машина половину ресурсов тратит не на полезную работу, а на спам вот этого. Драйвер переписывать - тоже не айс идея.
Геннадий
Ну дело пахнет к /dev/null, но блин, у меня только что было ощущение, что можно делать прямо, красиво. Выводить всякие ошибки и ворнинги, читать их по утрам вместе со свежей прессой. Ан... нет. Опять через ж...
AstraSerg
а не пробовали db.setLogLevel(-1, "network" ) ?
Геннадий
Дык -1 это использовать родительскую настройку. А родительская можетбыть только 0, -1 поставишь - не стартанёт.
AstraSerg
Геннадий
Ладно. Плюнул. Дефнул.
AstraSerg
больше мыслей нет
yopp
yopp
Половина ресурсов на логи?
AstraSerg
Геннадий
Половина ресурсов на логи?
Это художественная гипербола, литературный приём для подчёркивания моего негодования. Ну на самом деле journal настроен у меня сейчас не писать логи на диск, только в памяти. Сейчас парсится на виртуалке база около 40 гигов, там парсится бэкэндом большой xml и распихивается всё в MongoDB. Ну так journal при обработке логов процессор жрёт неплохо, ибо идёт спам от монги.
yopp
Информация о подключениях не просто так остаётся в логах. Если у вас в логах много сообщений о подключениях, то скорее всего вам необходимо использовать connection pool
AstraSerg
@GennadyKovalev Чёт как-то странно это....
yopp
Открытие соединения — дорогая операция, особенно если используется TLS
Геннадий
Про connection pool, про драйвера - это всё очень понятно. У меня вопрос не как убрать множественные коннекты, ибо это вопрос драйвера, а как убрать сообщения в логах. С драйвером мне всё понятно.
yopp
Геннадий
Метрики говорят, что пока грузит обработка логов. У меня задача за неделю файл распарсить, переписыванием драйверов я не хочу сегодня заниматься :) Ну /dev/null спасёт мир.
yopp
Отключите обработку логов и пишите в файл. Даже на высоконагруженных кластерах логгирование это около одного-двух мегабайт в секунду
Геннадий
Зачем мне писать логи в файл и дополнительно грузить диск, если я это читать не буду?
yopp
Это sequential write, который в таких объёмах не является проблемой
AstraSerg
Сделал:
while true; do echo hellohellohellohellohellohellohello | systemd-cat; done
получилось:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19771 root 20 0 27676 8248 3160 S 28.6 0.1 0:07.58 bash
265 root 20 0 41580 9516 7032 S 9.0 0.1 0:12.55 systemd-journal
Не то что бы сильно много и это с записью в файл
Геннадий
Вот, пожалуйста, /dev/null и грузит только мой бэк и монга. Всё нормуль.
yopp
Моя мысль в том, что у вас проблемы не с самим фактом журналирования, а где-то на этапе обработки журнала. Если это продуктивная инсталляция, то лечить надо причину, а не симптом
Геннадий
@AstraSerg ну понятно, у меня покруче нагрузочка была. bash несколько медленее...
Геннадий
yopp
Как я уже говорил: несколько мегабайт журнала в секунду (тысячи записей в журнал в секунду) , не должны являться проблемой. Если это является проблемой, это серьезный симптом
Геннадий
@AstraSerg ну я вчера залез в исходники драйвера... и как-то сник :) Если бы, как всегда, не срочность... Ну я сейчас обработаю свои 40 гигов с /dev/null, потом займысь выпрямлением количества коннектов.
AstraSerg
Геннадий
Как я уже говорил: несколько мегабайт журнала в секунду (тысячи записей в журнал в секунду) , не должны являться проблемой. Если это является проблемой, это серьезный симптом
Да выша мысль-то понятна. По-умолчанию systemd-journald` использует временное хранилище, которое живёт на `tmpfs`. Настраивать это можно сколь угодно долго, но это теоретически упрется в ресурс. Либо дай диск для хранение объёма, либо настрой фильтр чего логировать, а чего нет - это процессор, либо дай оперативки для хранения, либо настрой стирание старых записей - это тоже процессор. В данном случае у меня упор ушёл в процессор. И то не упор, а просто увидел, что "поджирает...".
Можно долго настраивать всякие rate limit и не собирать много сообщений от одой службы, но фокус вопроса не как обработать поток дряни, у меня вопроса тут нет. А почему вообще этот поток существует. С учётом того, что множественные соединения я прямо сегодня победить не могу, вот и задал вопрос как отключить поток всякого г... от монги. А то я может в читал доку и в упор чего-то не увидел. Ответ получил. Тоже никак. Ну значит срочняк решим с /dev/null, а лечить будем драйвер, а не обработку ненужного потока г...
AstraSerg
> а лечить будем драйвер
А что за язык, если не секрет?
Геннадий
Питон, c motor.
Геннадий
motor - обёртка для pymongo для поддержки ассинхронности. Вернее для псевдоассинхронности.
Мечтатель
Геннадий
Псевдо, потому что внутри motor создаёт пул тредов для запуска соединений с mongodb, а треды - это не асинхронность. В каждом треде живёт одно соединение. Асинхронного драйвера для mongodb в питоне нет.
Геннадий
Кстати, если кому интересно. Раскопал драйвер для python, вроде асинхронный по-настоящему: https://github.com/ZeoAlliance/aiomongo. Внутри посмотрел асинхронное соединение прямо с сервером и никаких тредов. Пишут, что сильно производительнее motor. Но его, особо никто не использует почему-то. И вялый проект какой-то. Странно...
AstraSerg
Геннадий
Я тоже потестирую на досуге... По фичам вроде всё основное есть.
AstraSerg
только вот Python 3.5.2 or later нужен. Не у всех есть...
Petro
Как можно понять, был ли документ изменен, добавлен, или документ вообще не изменялся при update?
AstraSerg
Petro
но как я понимаю, если даже документ существует и в нем ничего не было изменено, он всеравно возвращает что документ изменен?
AstraSerg
AstraSerg
вот пример:
rs0:PRIMARY> db.stat_tmp.update({status: 8}, {x: 1})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
Petro
а у меня возвращает nModified: 1 даже если документ совпадает
AstraSerg
Petro
тип?
Petro
да нет, один и тот же код испольняю через nodejs, один и тот же обьект
AstraSerg
Petro
🤦♂️ сори, туплю, у меня там Date.now() в документе)
AstraSerg
antofa
Привет всем!
antofa
Есть такой запрос http://dpaste.com/1K8VY4D . Он находит дату первого заказа для каждого пользователя. Теперь мне надо выбрать из заказов данные { id, is_first_order }. Это по сути $lookup, только для уже выбранных данных. Подскажите, как это сделать..
AstraSerg
antofa
Там привязываются другие таблицы, а у меня вроде подзапрос.
antofa
или в своем случае я могу сделать привязку 2 раза к таблицы orders, а потом просто сгруппировать нужные данные..
AstraSerg
antofa
Что-то вроде того - http://dpaste.com/2J91FZ5 и результат http://dpaste.com/2HKFD7A
antofa
Не знаю оптимально ли это, но тут по сути 2 запроса всего
AstraSerg
antofa
Спасибо за наводку)
antofa
пару часов просидел, думая
antofa
1000 где-то
AstraSerg
1000 где-то
1000 оно в памяти держать может даже без индексов
antofa
В конце еще добавлю { $group: { _id: { month: { $month: '$date_created', year: { $year: '$date_created' } } } и будет видна статистика returned и onetime покупателей по каждому месяцу
AstraSerg
antofa
с монго раньше не работал просто