Size: a a a

2021 February 06

O

Oybek in Tarantool
Vladislav Grubov
Ну вообще docker run tarantool/tarantool за подробностями настройки репликации, приложения и тп можно почитать тут: https://hub.docker.com/r/tarantool/tarantool
спасибо
источник

VG

Vladislav Grubov in Tarantool
https://github.com/tarantool/cartridge-cli#docker и стоит сюда ещё посмотреть, если используете cartridge
источник
2021 February 07

PP

Piu Piu in Tarantool
а для go не появился msgpack генератор для структур?
источник

PP

Piu Piu in Tarantool
и еще вопросик, не понимаю...

func BenchmarkSelect(tb *testing.B) {
 opts := tarantool.Opts{User: "api", Pass: "12345"}
 conn, _ := tarantool.Connect("127.0.0.1:3301", opts)
 tb.ReportAllocs()
 tb.ResetTimer()
 for n := 0; n < tb.N; n++ {
   conn.Select("accounts", 0, 0, 1, 0, []interface{}{1})
 }
}


обычный синтетический тест на маке, в базе всего 1 запись, обычный селект выдает всего 10к
BenchmarkSelect-8                  10000            115493 ns/op             793 B/op         20 allocs/op

это вообще кошерно?
источник

P

Pavel in Tarantool
а есть какая-нибудь другая машина?
я сталкивался с тем, что один и тот же код на маке работает заметно медленнее, чем на приблизительно аналогичной по железу виртуалке
источник

PP

Piu Piu in Tarantool
к сожалению сейчас нет
источник

PP

Piu Piu in Tarantool
хз может конечно дело в коннекторе... но все равно чет мало
источник

R

R-omk in Tarantool
Piu Piu
и еще вопросик, не понимаю...

func BenchmarkSelect(tb *testing.B) {
 opts := tarantool.Opts{User: "api", Pass: "12345"}
 conn, _ := tarantool.Connect("127.0.0.1:3301", opts)
 tb.ReportAllocs()
 tb.ResetTimer()
 for n := 0; n < tb.N; n++ {
   conn.Select("accounts", 0, 0, 1, 0, []interface{}{1})
 }
}


обычный синтетический тест на маке, в базе всего 1 запись, обычный селект выдает всего 10к
BenchmarkSelect-8                  10000            115493 ns/op             793 B/op         20 allocs/op

это вообще кошерно?
Так тут последовательное чтение, кто ж так тестирует, ну если только цель была не в этом
источник

R

R-omk in Tarantool
Piu Piu
и еще вопросик, не понимаю...

func BenchmarkSelect(tb *testing.B) {
 opts := tarantool.Opts{User: "api", Pass: "12345"}
 conn, _ := tarantool.Connect("127.0.0.1:3301", opts)
 tb.ReportAllocs()
 tb.ResetTimer()
 for n := 0; n < tb.N; n++ {
   conn.Select("accounts", 0, 0, 1, 0, []interface{}{1})
 }
}


обычный синтетический тест на маке, в базе всего 1 запись, обычный селект выдает всего 10к
BenchmarkSelect-8                  10000            115493 ns/op             793 B/op         20 allocs/op

это вообще кошерно?
Этот тест не показывает ничего кроме того что тарантул на локалхосте находится (rtt к нулю стремится)
источник

YS

Yura Sokolov in Tarantool
Piu Piu
и еще вопросик, не понимаю...

func BenchmarkSelect(tb *testing.B) {
 opts := tarantool.Opts{User: "api", Pass: "12345"}
 conn, _ := tarantool.Connect("127.0.0.1:3301", opts)
 tb.ReportAllocs()
 tb.ResetTimer()
 for n := 0; n < tb.N; n++ {
   conn.Select("accounts", 0, 0, 1, 0, []interface{}{1})
 }
}


обычный синтетический тест на маке, в базе всего 1 запись, обычный селект выдает всего 10к
BenchmarkSelect-8                  10000            115493 ns/op             793 B/op         20 allocs/op

это вообще кошерно?
В цикле в одном потоке больше 40к вы в принципе не получите из-за расходов на сетевое взаимодействие. Почему 10к, не знаю, у меня нет мака, чтоб проверить. Проверю на линуксе.
Запустите тот же тест в параллели (b.Parrallel), и скажите, что получите.
источник

YS

Yura Sokolov in Tarantool
А ещё есть асинхронный интерфейс для посылки пачки запросов.
источник

PP

Piu Piu in Tarantool
Yura Sokolov
В цикле в одном потоке больше 40к вы в принципе не получите из-за расходов на сетевое взаимодействие. Почему 10к, не знаю, у меня нет мака, чтоб проверить. Проверю на линуксе.
Запустите тот же тест в параллели (b.Parrallel), и скажите, что получите.
BenchmarkSelectParallel-8          57548             19763 ns/op

лучше да
источник

D

Denis in Tarantool
Piu Piu
BenchmarkSelectParallel-8          57548             19763 ns/op

лучше да
Не смотри на цифру слева, это не рпс, и в первом тесте было не 10к рпс. Написано 0,019 мс на операцию
источник

PP

Piu Piu in Tarantool
ок
источник

D

Denis in Tarantool
Это вроде кол-во прогонов теста
источник
2021 February 08

PP

Piu Piu in Tarantool
а нет ли какого то алгоритма чтобы посчитать возможное количество памяти при деплое?

к примеру всего 2 гб оперативки, я хочу под тарантул отдать максимальное количество памяти, где то читал что все данные *1.5 оверхеда/индексы и получаем что для 1 гб данных нужно выделить 1,5 гб памяти, а как коннекты влияют на память если только тарантул стоит на ноде? блин ночь, надеюсь понятен вопрос

я про memtx_memory
источник

ЯШ

Ярослав Шумаков... in Tarantool
Mons Anderson
Есть страничка в wiki https://github.com/tarantool/tarantool/wiki/Memory-size-calculation
Она описывает методику с точки зрения структур хранения данных

По хорошему, чтобы посчитать довольно точно, нужны:
* оценочное количество записей (в пределе) (N)
*  средний размер записи (строки/тапла). можно проверить в консоли, создав примерный тапл и посмотрев bsize (box.tuple.new{ "abc", 1e5, 42 }:bsize()) (S)
* размер чисто спейса будет N * ( S + 14 ) (без индексов)

далее считаем индексы.
* в зависимости от версии тарантула и типа индекса он занимает от 16 до 22 байт. можно взять оценку сверху в 22. итого все индексы: N * 22 * I, где I — это кличество индексов.

следующий этап: нагрузка.
тут нужно учесть 2 момент
* таплы "в полёте"  (обычно это малая величина в сравнении с общим объёмом. пример расчёта есть по ссылке)
* сетевые буфера. на одно соединение обычно расходуется 2 x readahead. дефолтный буфер всего 16Kb, но если его подкрутить в сторону нескольких мегабайт и подключить несколько тысяч клиентов, то может получиться очень внушительная цифра.

теперь Lua. "нормальным" можно считать потребление памяти в луа до 0.5 гб (но вообще предел в 2 гб).

Ну и напоследок можно выбрать коэффициент "ошибки". Вот тут уже те самые 10% вполне можно накинуть. туда войдёт фрагментация, какие-то неучтённые вещи.

Завершает расчёт умножение на количество реплик. Оптимальным считается использование 3х реплик в репликасете. Бывает используют 2, бывает 5 или больше.
^
источник

SC

Sergey Chernetsky in Tarantool
Всем доброе утро! Подскажите, если я итерируюсь по index_object:pairs(), то на каждой итерации происходит запрос к спейсу? Если да, то будет ли более эффективно получить массив всех строк через index_object:select() и потом по ним итерироваться, если речь идёт про большой vinyl спейс?
источник

ST

Satbek Turganbayev in Tarantool
Sergey Chernetsky
Всем доброе утро! Подскажите, если я итерируюсь по index_object:pairs(), то на каждой итерации происходит запрос к спейсу? Если да, то будет ли более эффективно получить массив всех строк через index_object:select() и потом по ним итерироваться, если речь идёт про большой vinyl спейс?
Да.
Нет, используйте :pairs. Если спейс большой, то из-за select все "встанет", также ответ может просто в Lua память не влезть.
Итерируйтесь через :pairs и делайте fiber.yield(), через каждные N записей - это позволит работать остальным файберам и не "повесит" тарантул на большом спейсе.
источник

SC

Sergey Chernetsky in Tarantool
Satbek Turganbayev
Да.
Нет, используйте :pairs. Если спейс большой, то из-за select все "встанет", также ответ может просто в Lua память не влезть.
Итерируйтесь через :pairs и делайте fiber.yield(), через каждные N записей - это позволит работать остальным файберам и не "повесит" тарантул на большом спейсе.
А если ответ не особо большой, то будет выигрыш, если делать select? Как-раз вопрос в том, что эффективнее в большом спейсе - 100 select-ов по 1 записи или один по 100 записей?
источник