
Daniel
08.07.2017
16:27:35
это похая секурити

m
08.07.2017
16:29:11
с обновлениями всё просто - делать их руками. только править чуть больше, чем при ручном перевыпуске

Daniel
08.07.2017
16:29:40
дело ваше. но это очень, очень плохое решение

Google

Daniel
08.07.2017
16:29:46
даже дать права - лучше

m
08.07.2017
16:30:25
а как тогда преодолеть будущую проблему: вебсервер запускается на двух разных машинах. как быть с файлами ?
на каждой перевупуск делать? будут разные файлы.
хотя, наверное лучше перевыпускать на одной машине, а потом копировать на все оставшиеся. а ещё лучше, отдельно nginx поставить и на нём весь TLS и крутить.
но nginx не хочется. лишнее звено, задержек добавляет и тройная работа с http-трафиком.

LexsZero
08.07.2017
17:14:10

m
08.07.2017
17:19:25
https://github.com/fiorix/go-daemon

Dmitry
08.07.2017
17:33:36

Daniel
08.07.2017
17:35:04

Труба
08.07.2017
17:37:00
Всем привет, мужик с хабры запретил мне вставлять интерфейс в стуктуры. Получается такой код неправильный или я запутался в терминах?
type Inserter interface {
insert()
}
type List struct {
Key string
inserter Inserter
}
func (li List) check() {
fmt.Printf("Checked: %s\n", li.Key)
li.inserter.insert()
}

m
08.07.2017
17:37:16
запускает от заданного юзера с заданой директорией, пишет вывод в лог, сохраняет пид-файл

Dmitry
08.07.2017
17:38:08

m
08.07.2017
17:38:24
правда пид-файл почему-то никак не могу заставить писать ?

Google

Труба
08.07.2017
17:38:34

Alexander
08.07.2017
17:56:47
обычнож всякие supervisord, systemd юзают

terry
08.07.2017
18:03:49

m
08.07.2017
19:28:23
да и было бы странно использовать fasthttp и ставить перед ним nginx
а никто не сталкивался с тем, что fasthttp начинает жрать процессор и перестаёт отвечать, если запускается не из под рута?

terry
08.07.2017
20:15:20
я вот решил почитать что такое го заодно мож чего написать, но пока что у меня твои тексты вызывавают когнитивный диссонанс
и еще - я у себя на серваке снес к хуям фряху и поставил дебиан
имхо грабли фри меня уже захарили...

corpix
08.07.2017
20:17:14

m
08.07.2017
20:18:21

corpix
08.07.2017
20:19:02
Ну тогда надо искать проблему в коде сервиса
И я не она... хотя имя смущает, да. Лол

Daniel
08.07.2017
20:36:03

terry
08.07.2017
20:36:34
а че есть там уровень дебаг левел или логирование?

m
08.07.2017
20:37:03
да до моих экспериментов с запуском демона под непривелигированным юзеров всё было ок. а сейчас одно ядро всё съедается почему-то и отвечает еле-еле.
есть net/http/pprof
хотя, наверное это в моём коде что-то чудесного. потому что и на девелоперской машине начало воспроизводиться.

Google

m
08.07.2017
20:43:53
Нашёл. делаю в цикле select и внутри него break для выхода из цикла. А оно из селета выходит, а не из цикла. Уже в который раз на эти грабли наступаю.
ИМХО, неудачная это конструкция, когда и select и for останавливаются одной командой.
хотя не знаю даже, как лучше сделать.

Daniel
08.07.2017
20:47:04
там можно лейбл указать

m
08.07.2017
20:51:04
да, так и написал. goto-style ?
Наконец то заработало: https://tolxy.com

Daniel
08.07.2017
20:53:24
я селект в отдельную функцию уношу обычно

m
08.07.2017
20:55:44
мне надо было из канала вычитать всё, что в нём накопилось и потом дальше продолжить работать.
OuterLoop:
for {
select {
case userID := <-fsm.usersToDelete:
deleteUsers = append(deleteUsers, userID)
default:
break OuterLoop
}
}
тут с функцией не знаю даже как переписать...

Daniel
08.07.2017
20:57:17
а зачем тут селект?!

m
08.07.2017
20:58:19
чтобы остановиться, когда в канале закончатся данные.

Daniel
08.07.2017
20:58:29
а это зачем?

m
08.07.2017
20:59:07
чтобы обработать все накопленные в канале данные пачкой.

Daniel
08.07.2017
20:59:18
зачем переставать?

corpix
08.07.2017
20:59:40
Мне нравится стиль выдавать информацию порциями, вместо того чтобы обрисовать общую картину вцелом :)

Daniel
08.07.2017
21:00:24
вообще, конечно, я могу себе представиь, зачем

m
08.07.2017
21:00:33
ну как: выкачал данные из канала, поделал с ними что-то , поделал ещё что-то нужное, потом выкачал следующую пачку и т.д.

Daniel
08.07.2017
21:00:59
в одной горуине вынимаешь данные из канала
в другой делаешь свое другое
я, вообще-то, могу представить, зачем вот это вот нужно

Google

m
08.07.2017
21:02:24
у меня иначе: раз в несколько милисекунд пересчитвается вся игровая арена. а данные для этого пересчёта накапливаются заранее.

Daniel
08.07.2017
21:02:53
то есть - налицо формирователь batch job
тогда твоя функция выглядит примерно так
func getBatchJob(job <- chan *Job, maxBatchSize int, maxBatchDelay time.Duration) []*Job
и вместо брейка у тебя ретёрн
и это слегка более очевидно

m
08.07.2017
21:06:19
Отличная мысль про return!

Daniel
08.07.2017
21:06:33
обращайтесь
но этот getBatchJob тебе все равно гонять в цикле в отдельной горутине

m
08.07.2017
21:07:19
небольшое улучшение: func getBatchJob(job <- chan *Job, maxBatchSize int, maxBatchDelay time.Duration, jobs []*Job) []*Job

Daniel
08.07.2017
21:07:32
а?!
зачем?

m
08.07.2017
21:07:45
make чтобы не делать

Daniel
08.07.2017
21:08:00
да чем тебе make-то не угодил?

m
08.07.2017
21:10:03
память выделяет. а зачем, если можно один раз создать слайс и работать с ним в цикле много раз, в конце цикла делая jobs = jobs[:0]

Daniel
08.07.2017
21:11:00
measure then optimise
ты померял разницу?

m
08.07.2017
21:30:06
Я когда писал свою Тауку, то там это очень сильно было заметно. Когда убрал все аллокации, то упёрся в производительность sync.Pool-а .
а писать так, чтобы не было аллокаций и синкпулов не так и сложно. просто чуть иначе подходишь к структуре кода и всё.
так что никакой преждевременной оптимизации нет. сразу пишу нормально.

Google

Daniel
08.07.2017
21:31:47
ну ок

m
08.07.2017
21:38:34
а как реализовать отладку на работающем веб-сервере? есть "-race" и "net/http/pprof" , но они ведь вроде кучу своих данных накапливают и со временем займут всю свободную память.
сейчас выходит монолитный веб-сервер, который всё держит в себе и пустить часть трафика на сторону не выйдет.

Daniel
08.07.2017
21:41:32
можно заставить его помереть после определенного количества запросов

m
08.07.2017
21:43:24
это сотрёт весь игровой мир. он в оперативке живёт.

Vladimir
08.07.2017
21:43:39
-race другой более вредной для прода особенностью обладает

m
08.07.2017
21:44:36
-race точно копит. а про net/http/pprof на 100% не знаю. может и не копит.

Vladimir
08.07.2017
21:44:38
у него просто огромный оверхед по скорости, плюс жесткий однопоток
но как бы это мелочь

m
08.07.2017
21:46:28
профайлинг по cpu имеет мало смысла. намного интереснее смотреть мьтексы, благо они появились.

Vladimir
08.07.2017
21:47:00
зависит от ситуации )
мне намного интереснее смотреть вообще heap :)
потому что у меня код такой, что он может в некоторых условиях начать кушать

m
08.07.2017
21:47:45
просто задачи, жрущие cpu обычно не на Go пишут.