Anonymous
когда чел писал, что-то для операционки чтобы команды считывать(?) и про это говорили
Anonymous
такое ощущение что у тебя узлы много весят
Anonymous
хз без кода сложно сказать
Anonymous
ну или переполнение буфера
🔥
Гц отрабатывает не сразу если что, но причина скорей всего не в нем
🔥
Ты код покажи тех функций что память выделяют, вполне может быть что у тебя гдето утечка
🔥
А сколько горутин ты создаешь
🔥
Вместо тысячи слов
https://go.dev/src/runtime/mgc.go
Royal
может ты там файлы читаешь в память полностью?
Royal
может читаешь слишком много сразу, больше чем памяти есть, либо ссылки остаются и гц не собирает
Royal
профайлером пройдись
Royal
https://go.dev/src/runtime/pprof/pprof.go
Royal
в первой строке это имя флага, а не путь
Royal
оставь как есть в примере
Royal
а потом запускай с флагом
Royal
go test -memprofile mem.prof -bench .
Royal
go tool pprof mem.prof
Royal
https://go.dev/doc/diagnostics#profiling
Royal
https://tproger.ru/translations/memory-leaks-investigation-in-go-using-pprof/
Alexander
https://pkg.go.dev/net/http/pprof - это юзай
Alexander
Базу юзаешь? ограничение на Кол-во соединений стоит?
Alexander
Какие ещё внешние ресурсы есть?
Alexander
Какие другие?
Alexander
Вообще без ограничения кол-ва соединений никто не работает
Alexander
SetMaxIdleConnections или как-то так
Alexander
Ну поставь ограничение в 2 соединения и посмотри падает или нет по памяти, и если не падает, то отвечает ли вообще
Тимофей
а вообще часто флаги для запуска используются?
Тимофей
https://pkg.go.dev/flag
mishka
у меня тоже самое было при коннекте к постгресу. запросы не успевали обрабатываться и зависали в памяти. память в конце концов заканчивалась, по результату паника.
решилось ограничением на запуск горутин
mishka
поставил ограничение на запуск новой горутины, покуда не отработала старая
mishka
делается через семафор
🅞leksiy
Ну если профайлить не выходит... Попробуй подменять функции заглушками, возвращающими необходимый результат, постепенно продвигаясь выше ниже по стеку. Чтобы локализовать "вредный" код.
mishka
🅞leksiy
А db в данном случае, что за объект?
🅞leksiy
Ну типа метод .dml()
🅞leksiy
Ну метод неэкспортируемый, значит свой, там хз что может быть в нем, я об этом
Alexander
В мускуле ты так дыры в айдишниках создаешь)
Alexander
Ну и соответственно авто инкремент сдвигаешь. Может кончится
Alexander
Вообще это неправильный подход. В гошке можно накапливать и отдельной го рутиной раз в н минут сбрасывать
Alexander
Если у тебя ещё индекс на изменяемом поле, то весело может быть
Alexander
Если страшно потерять каунтер, то уже в редис какой писать и отдельным скриптом вычитывать и слать в мускуль
Alexander
вообще это прям анти-паттерн:
func (d *Database) selectRows(query string, params *[]interface{}) *[]map[string]interface{}
func (d *Database) getResult(rows *sql.Rows) map[string]interface{} {
Лучше вот эти две функции выкинуть и описывать нормально структуры под строчки, которые хочешь получить и не пользоваться ужасным map[string]interface{}
Alexander
К делу не относится, но лучше так не делать
Alexander
зачем, если можно этот этап пропустить?
Alexander
посмотри тогда sqlx
Alexander
var records []Record
err := db.Select(sqlStr, &records)
Alexander
быстро и нет таких странных накладных расходов
Alexander
так а профилирование что говорит?
Andrey
а на какой ОС работает программа?
Andrey
Посмотри, не вырубает ли у тебя линукс программу, через команду dmesg
Ilya
Точно нет никакого вложенного цикла или функции?
Alexander
Да как бы go убрать и проверить ок - не ок
Maks
я тут как то начал либу делать
Maks
гляньте
Maks
https://github.com/bless-rng/marmot
Maks
мигратор
Maks
примитивный довольно
Maks
Это первое подобие поделки на го
Maks
Ну и эт не итоговый вариант. Я пока не придумал как сделать наиболее адекватно. И думаю излишнюю свободу юзеру давать не обязательно.
Maks
Может быть вообще закрыть от расширения, сделать только что бы вот какие есть сейчас ОРМ в поддержке те пусть и будут, нужно будет добавить просто я сам добавлю диалект и всё, и пользуйтесь.
Bagasl
Bagasl
всегда писал через Up = state(«UP»)
Emil
Maks
Нет, это означает что он будет поддерживать например только постгрес, майскуэль, майкрософтскуэль и эскуэль лайт. И нельзя будет менять структуру таблицы миграций, управлять тем как она заполняется
Maks
С одной стороны дать такую возможность это хорошо, с другой это потенциальные вопросы.
Maks
Ну и надо еще подумать как сделать выполнение миграций. Наверняка нужна команда выполнить все, но нужна ли «выполнить определенную». В целом такая возможность заложена.
Maks
Я каждый может по своему реализовать вообще все ап, даун и все остальное. В своем проекте. У меня тут будет чисто базис
Maks
То есть сейчас это генерация файлов миграции, их парсинг и выполнение, сохранение миграций в таблицу миграций
Alexander
Это чисто для себя или умеет то, чего не умеют другие?
Alexander
Как использоваться должно?
🔥
Я конечно не на что не намекаю, но выглядит так словно ты делаешь c2 для ботнета. Айайай
🔥
Тогда понятно.
🔥
Это команд контрол сервер для управления ботами, используется злоумышленниками.
Alexander
типа фронтовая часть для общения с сервером, в котором лежит логика ботов?
Alexander
а, прогуглил, окей
Anonymous
что она делает?
Anonymous
а сколько idle connection есть?
Maks
Это чисто для себя или умеет то, чего не умеют другие?
Сначала для себя делать начал, потом подумал для всех. Что умеет - расширяться для любых субд на стороне юзера, не зависеть от драйвера(можно использовать любой какой захочется, так как дб коннект передается в зависимости). Ну и создавать голые sql для миграций с секционированием up, down и возможностью выполнять несколько команд за одну миграцию, посредством разделения блоков через комментарий —then
Maks
Если бы чисто для себя делал я бы не закладывал бы возможность расширения извне, что бы помимо mysql, postgresql, microsoftsql и sqlite можно было другие юзать, реализовав 4 метода в собственном «диалекте» и используя его. Но я думаю скрыть эту возможность и расширять функциональность посредствам развития проекта.
Nazim HAN (BEK, ZHAN)
Всем привет! Подскажите какой нибудь курс по Go, где много практики. Спасибо.