Previous Entry Share Next Entry
2016-01

640k is enough for everyone

сделал я значит логгер, с сообщениями пронумерованными как int32

и решил показать в дашборде последнее сообщение лога.
запустил, долго думал "где же баг" - вместо номера сообщения какой-то случайный мусор :)

потом осознал, что бага нет, а логгер в тесте

while(true) { log("HELLO") }

выдаёт сколько-то там миллионов RPS и лепить в счетчик int32 было как-то, хмм, опрометчиво, потому что переполняется он мгновенно :) хороший логгер получился, короче.

This entry was originally posted at http://wizzard.dreamwidth.org/472745.html. It has comment count unavailable comments. Please comment there using OpenID.

  • 1
vaddimka May 17th, 2016
Делал недавно что-то такое с циклическим буфером на мегабайт и произвольной длиной сообщения, кстати надо посмотреть, вставил ли я туда счетчик. Туда же всунул опциональную регистрацию всех сообщений из данного c файла под определенным именем модуля и логлевел. Вообще интересно иногда на чистых сях писать, столько всего руками поделать можно.

mbr May 17th, 2016
Каноническая реализация кольцевых буферов подразумевает размеры 2^n и маску 2^n - 1, что превращает переполнение из головной боли в фичу.

vaddimka May 17th, 2016
Я помню что самый большой геморрой был это когда данные "заворачиваются" за конец буфера, учитывая что сообщения произвольной длины получается достаточно нетривиально рассчитать все позиции включая заголовок, длину сообщения, само сообщение. Так-то оно вроде тривиально, но если не делать что-то типа "о, оно не помещается целиком, давай завернем", я в итоге убил часа четыре )

mbr May 17th, 2016
Изначально кольцевые буферы использовались для символьных устройств - т.е. когда размер данных одинаков. В случае разной длины лучше использовать указатели на структуру или выбрать другую модель реализации. Например, гугловские bip буферы.

wizzard0 May 17th, 2016
...или делать буфер блоков

mbr May 17th, 2016
Не. Медленно, геморройно, фрагментация.

wizzard0 May 17th, 2016
я имею в виду случай, когда сообщение переменного, но конечного размера.

если бесконечного, тогда да, гемор всегда

  • 1
?

Log in

No account? Create an account