А есть кто интересуется разработкой на Go?
Привет коллеги, предлагаю создать сообщество, собираться периодически, обмениваться опытом, идеями по Go.
Привет коллеги, предлагаю создать сообщество, собираться периодически, обмениваться опытом, идеями по Go.
-
-
Кому актуально набираємо GoLang Trainee в Харкові. Всі деталі в LinkedIn або Skype: live:burenok_3
Нам нужен Go Full Stack разработчик.
Стек: Go / ReactJS / JS
Мы развиваем продукт под названием RetargetApp — приложение для e-commerce платформ (Shopify, BigCommerce) и т.д. Наше приложение помогает владельцам интернет-магазинов автоматизировать создание и повышать эффективность ретаргетинговых кампаний в Facebook и Instagram
Детальнее: jobs.dou.ua/…argetapp/vacancies/33180
Мы сейчас ищем к себе Golang программиста для работы над Demand Side Platform. Если интересно — свяжитесь со мной через linkedin или через DOU.
Коментар порушує правила спільноти і видалений модераторами.
Коментар порушує правила спільноти і видалений модераторами.
писав на пітоні і рубі, сішка якось не йшла — але от го йде по повній , втягує потроху.
Єдине , що незвичне так це — ерор хендлінг , а так суперська річ
Коментар порушує правила спільноти і видалений модераторами.
Коментар порушує правила спільноти і видалений модераторами.
Коментар порушує правила спільноти і видалений модераторами.
Очень крутой язык, недавно пытался штурмовать книгу, ну знаете, такая с оленем, времени пока не хватило на полное осиляторство, но общий концепт и работы Фиори ( github.com/fiorix ) впечатляют — парень переписал freegeoip.net c python/twisted на Go и ничего не боится.
Я интересуюсь и даже пишу кое-что на go:
— github.com/...valyala/goloris — slowloris для nginx
— github.com/.../go/cdn-booster — быстрый кэширующий http-прокси для статического контента небольших размеров (картинки, js, css, mp3). Быстрее nginx’а :)
— github.com/...ps/go/memcached — memcache-совместимый сервер с прозрачной поддержкой persistence, объем кэша может превышать объем оперативной памяти в десятки раз, размер кэшируемых объектов не ограничен 2Мб, в отличие от memcached.
Я не спец в тюнинге nginx’а.
В моих синтетическах тестах go-cdn-booster работает быстрее nginx’а при следующих настройках:
go-cdn-booster:
./go-cdn-booster -upstreamHost=www.google.com -maxConnsPerIp=64 -cacheFilesPath=/var/www/cache2
nginx:
keepalive_requests 10000000; proxy_cache_path /var/www/cache levels=1:2 keys_zone=my-cache:100k max_size=100m inactive=600m; proxy_temp_path /var/www/cache/tmp; proxy_pass http://www.google.com; proxy_cache_valid 200 60m; proxy_cache my-cache;
Тесты проводились с помощью программы go-cdn-booster-bench, также, как нетрудно догадаться, написанной на go:
Тест nginx:
$ ./go-cdn-booster-bench -testUrl=http://localhost:80/images/srpr/logo11w.png -requestsCount=300000 -workersCount=64 goMaxProcs=4 requestsCount=300000 testUrl=http://localhost:80/images/srpr/logo11w.png workersCount=64 2014/02/19 08:51:37 Test started 2014/02/19 08:51:46 Done 2014/02/19 08:51:46 300000 requests from 64 workers in 9.54066905s 2014/02/19 08:51:46 31444 qps, 453679 Kbps
Тест go-cdn-booster:
$ ./go-cdn-booster-bench -testUrl=http://localhost:8098/images/srpr/logo11w.png -requestsCount=300000 -workersCount=64 goMaxProcs=4 requestsCount=300000 testUrl=http://localhost:8098/images/srpr/logo11w.png workersCount=64 2014/02/19 08:51:54 Test started 2014/02/19 08:51:57 Done 2014/02/19 08:51:57 300000 requests from 64 workers in 3.388799157s 2014/02/19 08:51:57 88527 qps, 1254515 Kbps
Выводы делайте сами.
Синтетика это конечно круто, но получить отрыв в 281% по сравнению с промышленным стандартом смахивает на сказку. Возможно, стоит протестировать в реальных условиях?
А что твои прокси и мемкешед делают когда у го включается stop the world garbage collector?
Вот результаты сравнительных тестов go-memcached (порт 11212) против memcached (порт 11211) с помощью программы go-memcached-bench:
cache-miss
$ ./go-memcached-bench -serverAddrs=localhost:11212 -workerMode=GetMiss
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=100000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=20ms
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=localhost:11212
valueSize=200
workerMode=GetMiss
workersCount=4096
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 2ms: 5.854% ###
2ms - 4ms: 7.121% ####
4ms - 6ms: 7.295% ####
6ms - 8ms: 13.178% #######
8ms - 10ms: 21.906% #############
10ms - 12ms: 20.414% ############
12ms - 14ms: 11.816% #######
14ms - 16ms: 4.267% ##
16ms - 18ms: 2.423% #
18ms -1h0m0s: 5.727% ###
Requests per second: 407204
Test duration: 2.455773052s
Avg response time: 9.662755ms
Min response time: 30.761us
Max response time: 40.754728ms
Cache miss count: 1000000
Cache hit count: 0
Cache miss ratio: 100.000%
Errors count: 0
$ ./go-memcached-bench -serverAddrs=localhost:11211 -workerMode=GetMiss
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=100000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=20ms
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=localhost:11211
valueSize=200
workerMode=GetMiss
workersCount=4096
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 2ms: 7.520% ####
2ms - 4ms: 7.327% ####
4ms - 6ms: 6.481% ###
6ms - 8ms: 9.386% #####
8ms - 10ms: 12.094% #######
10ms - 12ms: 14.727% ########
12ms - 14ms: 12.960% #######
14ms - 16ms: 7.287% ####
16ms - 18ms: 5.089% ###
18ms -1h0m0s: 17.129% ##########
Requests per second: 173068
Test duration: 5.778064757s
Avg response time: 23.349264ms
Min response time: 23.972us
Max response time: 219.261123ms
Cache miss count: 1000000
Cache hit count: 0
Cache miss ratio: 100.000%
Errors count: 0
cache hit:
$ ./go-memcached-bench -serverAddrs=localhost:11212 -maxResponseTime=50ms -workerMode=GetHit
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=100000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=50ms
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=localhost:11212
valueSize=200
workerMode=GetHit
workersCount=4096
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 5ms: 7.852% ####
5ms - 10ms: 12.609% #######
10ms - 15ms: 16.092% #########
15ms - 20ms: 15.300% #########
20ms - 25ms: 13.315% #######
25ms - 30ms: 14.395% ########
30ms - 35ms: 10.841% ######
35ms - 40ms: 5.294% ###
40ms - 45ms: 2.570% #
45ms -1h0m0s: 1.732% #
Requests per second: 195700
Test duration: 4.994024613s
Avg response time: 20.27249ms
Min response time: 35.068us
Max response time: 81.157051ms
Cache miss count: 22668
Cache hit count: 977332
Cache miss ratio: 2.267%
Errors count: 0
$ ./go-memcached-bench -serverAddrs=localhost:11211 -maxResponseTime=50ms -workerMode=GetHit
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=100000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=50ms
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=localhost:11211
valueSize=200
workerMode=GetHit
workersCount=4096
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 5ms: 13.824% ########
5ms - 10ms: 13.091% #######
10ms - 15ms: 14.725% ########
15ms - 20ms: 12.219% #######
20ms - 25ms: 10.299% ######
25ms - 30ms: 10.332% ######
30ms - 35ms: 7.666% ####
35ms - 40ms: 5.125% ###
40ms - 45ms: 2.662% #
45ms -1h0m0s: 10.058% ######
Requests per second: 127611
Test duration: 7.836205096s
Avg response time: 31.276171ms
Min response time: 23.363us
Max response time: 262.202889ms
Cache miss count: 13
Cache hit count: 999987
Cache miss ratio: 0.001%
Errors count: 0
cache set:
$ ./go-memcached-bench -serverAddrs=localhost:11212 -maxResponseTime=50ms -workerMode=Set
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=100000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=50ms
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=localhost:11212
valueSize=200
workerMode=Set
workersCount=4096
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 5ms: 14.660% ########
5ms - 10ms: 28.087% ################
10ms - 15ms: 33.102% ###################
15ms - 20ms: 15.665% #########
20ms - 25ms: 5.600% ###
25ms - 30ms: 1.667% #
30ms - 35ms: 0.922%
35ms - 40ms: 0.286%
40ms - 45ms: 0.010%
45ms -1h0m0s: 0.000%
Requests per second: 347328
Test duration: 2.879125567s
Avg response time: 11.482975ms
Min response time: 31.333us
Max response time: 43.29533ms
Cache miss count: 0
Cache hit count: 0
Cache miss ratio: 0.000%
Errors count: 0
$ ./go-memcached-bench -serverAddrs=localhost:11211 -maxResponseTime=50ms -workerMode=Set
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=100000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=50ms
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=localhost:11211
valueSize=200
workerMode=Set
workersCount=4096
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 5ms: 8.575% #####
5ms - 10ms: 17.683% ##########
10ms - 15ms: 19.787% ###########
15ms - 20ms: 18.217% ##########
20ms - 25ms: 13.677% ########
25ms - 30ms: 8.367% #####
30ms - 35ms: 6.126% ###
35ms - 40ms: 3.011% #
40ms - 45ms: 1.974% #
45ms -1h0m0s: 2.584% #
Requests per second: 219066
Test duration: 4.564834956s
Avg response time: 18.503356ms
Min response time: 30.492us
Max response time: 214.13269ms
Cache miss count: 0
Cache hit count: 0
Cache miss ratio: 0.000%
Errors count: 0
Выводы делайте сами.
У тебя какие то микро бенчмарки, там наверняка ГЦ даже не включился потому что все элементарно помещается в памяти. Сделай айтемы по 100КБ (веб страница) сделай миллиард запросов, и 100 млн уникальных айтемов.
Ну и твой Г-код поддерживать врагу не посоветуешь.
Точнее миллиард запросов это слегка дофига. Можно 10 миллионов и миллион айтемов.
100 кб для айтема — слишком много. Тут производительность упрется в пропускную способность памяти, а в реальных условиях — в пропускную способность канала связи. На моем компе производительность ограничена 5к запросами в секунду как для memcached, так и для go-memcached.
К тому, исходя из моего опыта, в memcached обычно хранятся не html-страницы (для этого лучше подходит go-cdn-booster :)), а более мелкие айтемы. Например, небольшие списки айдишек либо строк или небольшие блоки html-кода. Т.е. размер айтема редко превышает 1кб.
Вот результаты тестов для 1кб айтемов. Надеюсь, тут gc сработал — ведь нужно «прокачать» минимум 10М*1Кб=10Гб памяти.
$ ./go-memcached-bench -workersCount=32 -maxResponseTime=0.5ms -valueSize=1000 -itemsCount=1000000 -requestsCount=10000000 -serverAddrs=localhost:11211 -workerMode=Set
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=1000000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=500us
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=10000000
responseTimeHistogramSize=10
serverAddrs=localhost:11211
valueSize=1000
workerMode=Set
workersCount=32
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 50us: 2.280% #
50us - 100us: 12.980% #######
100us - 150us: 17.241% ##########
150us - 200us: 19.377% ###########
200us - 250us: 16.497% #########
250us - 300us: 11.886% #######
300us - 350us: 7.440% ####
350us - 400us: 4.266% ##
400us - 450us: 2.401% #
450us -1h0m0s: 5.632% ###
Requests per second: 132652
Test duration: 1m15.385073951s
Avg response time: 238.194us
Min response time: 20.495us
Max response time: 35.115358ms
Cache miss count: 0
Cache hit count: 0
Cache miss ratio: 0.000%
Errors count: 0
go-memcached:$ ./go-memcached-bench -workersCount=32 -maxResponseTime=0.5ms -valueSize=1000 -itemsCount=1000000 -requestsCount=10000000 -serverAddrs=localhost:11212 -workerMode=Set
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=1000000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=500us
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=10000000
responseTimeHistogramSize=10
serverAddrs=localhost:11212
valueSize=1000
workerMode=Set
workersCount=32
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 50us: 1.076%
50us - 100us: 15.249% #########
100us - 150us: 39.057% #######################
150us - 200us: 25.207% ###############
200us - 250us: 11.972% #######
250us - 300us: 3.817% ##
300us - 350us: 1.274%
350us - 400us: 0.588%
400us - 450us: 0.321%
450us -1h0m0s: 1.440%
Requests per second: 192631
Test duration: 51.91281302s
Avg response time: 163.343us
Min response time: 18.762us
Max response time: 12.010048ms
Cache miss count: 0
Cache hit count: 0
Cache miss ratio: 0.000%
Errors count: 0
$ ./go-memcached-bench -workersCount=32 -maxResponseTime=0.5ms -valueSize=1000 -itemsCount=1000000 -requestsCount=10000000 -serverAddrs=localhost:11211 -workerMode=GetHit
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=1000000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=500us
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=10000000
responseTimeHistogramSize=10
serverAddrs=localhost:11211
valueSize=1000
workerMode=GetHit
workersCount=32
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 50us: 2.286% #
50us - 100us: 12.201% #######
100us - 150us: 22.486% #############
150us - 200us: 25.969% ###############
200us - 250us: 16.410% #########
250us - 300us: 8.935% #####
300us - 350us: 4.151% ##
350us - 400us: 2.220% #
400us - 450us: 1.309%
450us -1h0m0s: 4.034% ##
Requests per second: 66553
Test duration: 1m6.527642454s
Avg response time: 213.235us
Min response time: 19.415us
Max response time: 27.464948ms
Cache miss count: 5572402
Cache hit count: 4427598
Cache miss ratio: 55.724%
Errors count: 0
go-memcached:$ ./go-memcached-bench -workersCount=32 -maxResponseTime=0.5ms -valueSize=1000 -itemsCount=1000000 -requestsCount=10000000 -serverAddrs=localhost:11212 -workerMode=GetHit
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=1000000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=500us
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=10000000
responseTimeHistogramSize=10
serverAddrs=localhost:11212
valueSize=1000
workerMode=GetHit
workersCount=32
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 50us: 1.162%
50us - 100us: 11.050% ######
100us - 150us: 26.527% ###############
150us - 200us: 29.842% #################
200us - 250us: 18.321% ##########
250us - 300us: 6.570% ###
300us - 350us: 2.271% #
350us - 400us: 1.075%
400us - 450us: 0.637%
450us -1h0m0s: 2.545% #
Requests per second: 75072
Test duration: 58.933025638s
Avg response time: 189.271us
Min response time: 20.846us
Max response time: 13.977799ms
Cache miss count: 5575757
Cache hit count: 4424243
Cache miss ratio: 55.758%
Errors count: 0
К тому же у memcached есть одна неприятная вещь под названием memcache slab calcification, которая проявляется в том, что если мемкэш полностью заполнен айтемами одного размера, а потом внезапно мы решим заполнить его айтемами другого размера, то у memcached’а проявится склероз — он не будет запоминать новые айтемы :)
Вот как это легко проявляется с помощью go-memcached-bench:
заполняем кэш айтемами по 1кб
$ ./go-memcached-bench -workersCount=32 -maxResponseTime=0.5ms -valueSize=1000 -itemsCount=450000 -requestsCount=1000000 -serverAddrs=localhost:11211 -workerMode=GetHit
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=450000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=500us
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=localhost:11211
valueSize=1000
workerMode=GetHit
workersCount=32
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 50us: 2.163% #
50us - 100us: 10.421% ######
100us - 150us: 14.800% ########
150us - 200us: 19.111% ###########
200us - 250us: 18.670% ###########
250us - 300us: 12.948% #######
300us - 350us: 8.095% ####
350us - 400us: 4.442% ##
400us - 450us: 2.412% #
450us -1h0m0s: 6.939% ####
Requests per second: 119388
Test duration: 8.237937785s
Avg response time: 260.207us
Min response time: 19.285us
Max response time: 43.430137ms
Cache miss count: 16485
Cache hit count: 983515
Cache miss ratio: 1.648%
Errors count: 0
теперь безуспешно пытаемся заполнить кэш айтемами по 500 байт. Обратите внимание на cache miss ratio:
$ ./go-memcached-bench -workersCount=32 -maxResponseTime=0.5ms -valueSize=500 -itemsCount=450000 -requestsCount=1000000 -serverAddrs=localhost:11211 -workerMode=GetHit
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=450000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=500us
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=localhost:11211
valueSize=500
workerMode=GetHit
workersCount=32
writeBufferSize=57344
Preparing...done
starting...2014/02/21 11:17:08 Unexpected line read=[ERROR]. It should start with [VALUE ]
2014/02/21 11:17:08 Unexpected line read=[ERROR]. It should start with [VALUE ]
2014/02/21 11:17:08 Unexpected line read=[ERROR]. It should start with [VALUE ]
2014/02/21 11:17:08 Cannot write 5 bytes to output stream: [use of closed network connection]
2014/02/21 11:17:08 Cannot write 5 bytes to output stream: [use of closed network connection]
2014/02/21 11:17:08 Cannot write 5 bytes to output stream: [use of closed network connection]
done
Response time histogram
0 - 50us: 0.000%
50us - 100us: 4.839% ##
100us - 150us: 22.903% #############
150us - 200us: 38.387% #######################
200us - 250us: 20.323% ############
250us - 300us: 4.194% ##
300us - 350us: 3.548% ##
350us - 400us: 0.323%
400us - 450us: 0.645%
450us -1h0m0s: 4.839% ##
Requests per second: 213
Test duration: 1.458769672s
Avg response time: 245.41us
Min response time: 61.059us
Max response time: 2.907143ms
Cache miss count: 91434
Cache hit count: 310
Cache miss ratio: 99.662%
Errors count: 908256
теперь безуспешно пытаемся заполнить кэш айтемами по 2кб:
$ ./go-memcached-bench -workersCount=32 -maxResponseTime=0.5ms -valueSize=2000 -itemsCount=450000 -requestsCount=1000000 -serverAddrs=localhost:11211 -workerMode=GetHit
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=450000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=500us
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=localhost:11211
valueSize=2000
workerMode=GetHit
workersCount=32
writeBufferSize=57344
Preparing...done
starting...2014/02/21 11:19:31 Unexpected line read=[ERROR]. It should start with [VALUE ]
2014/02/21 11:19:31 Unexpected line read=[ERROR]. It should start with [VALUE ]
2014/02/21 11:19:31 Cannot write 5 bytes to output stream: [use of closed network connection]
2014/02/21 11:19:31 Cannot write 5 bytes to output stream: [use of closed network connection]
2014/02/21 11:19:31 Unexpected line read=[ERROR]. It should start with [VALUE ]
2014/02/21 11:19:31 Cannot write 5 bytes to output stream: [use of closed network connection]
done
Response time histogram
0 - 50us: 0.000%
50us - 100us: 5.208% ###
100us - 150us: 16.667% #########
150us - 200us: 30.208% ##################
200us - 250us: 19.792% ###########
250us - 300us: 13.542% ########
300us - 350us: 3.125% #
350us - 400us: 2.083% #
400us - 450us: 3.125% #
450us -1h0m0s: 6.250% ###
Requests per second: 57
Test duration: 1.698048474s
Avg response time: 260.033us
Min response time: 78.834us
Max response time: 1.988618ms
Cache miss count: 91066
Cache hit count: 96
Cache miss ratio: 99.895%
Errors count: 908838
У go-memcached такой болезни нет.
Реальные аппликухи не работают на слабеньких компах.
Попробуйте потестить в облаке хотя бы.
Думаю, что over 100к запросов в секунду на слабеньком компе покроют нужды 99% высоконагруженных проектов в интернете. Поэтому не вижу смысла в тестах на более мощных компах.
На моем компе производительность ограничена 5к запросами в секунду как для memcached, так и для go-memcached.Ваши слова?
Думаю, что over 100к запросов в секунду на слабеньком компе покроют нужды 99% высоконагруженных проектов в интернете.Сами хоть понимаете, что бред написали?
Как 5к так быстро превратились в 100к ?Может, стоит еще раз прочесть мой комментарий вместо того, чтобы выдергивать фразы из контекста?
Сами хоть понимаете, что бред написали?Не понимаю. Давайте проведем небольшой расчет. Согласно статистике, сайтом «вконтакте» пользуются 60 миллионов посетителей в сутки. Сколько запросов на одного посетителя в сутки сможет обработать сферический go-memcached на слабом компе (в вакууме) с производительностью 100к запросов в секунду? 100К*3600*24/60М=144 запроса в сутки. На всех может не хватить :) Значит, вконтакте входит в тот самый 1% высоконагруженных сайтов, которым мало одного мемкеш-сервера :)
Не понимаю.Это заметно (
Про характер реальной нагрузки у меня есть интересная статья, в которой почему-то поехало форматирование. Когда я ее писал, с форматированием было все ок.
Опыт важнее статей. В статье лишь часть важного. Да и статья не слишком удачна, извините.
Главная проблема в том, что поток тестовых запросов не является Пуассоновским процессомДа, это главная проблема статьи) — проблема того, что реальная нагрузка также далека от Пуассоновских потоков — вы упустили основное, реальная нагрузка может быть совершенно неоднородна.
Пуассо́на пото́к (проце́сс) — ординарный поток однородных событий
Выдержка из статьи на википедии про пуассоновский процесс:
The following examples are also well-modeled by the Poisson process:
...
— Requests for individual documents on a web server
Мне вот еще что интересно, почему ты тестируешь сценарий: вначале засунем 10млн записей, а потом прочтем 10млн записей. Тебе не кажется что в реальной жизни трафик слегка смешанный?
Вот результаты тестов по смешанному трафику — 90% чтение, 10% запись (см. параметры workerMode и getRatio):
memcached:
$ ./go-memcached-bench -maxResponseTime=1ms -workersCount=32 -serverAddrs=127.0.0.1:11211 -workerMode=GetSet
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=100000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=1ms
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=127.0.0.1:11211
valueSize=200
workerMode=GetSet
workersCount=32
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 100us: 7.094% ####
100us - 200us: 23.259% #############
200us - 300us: 34.651% ####################
300us - 400us: 17.681% ##########
400us - 500us: 7.689% ####
500us - 600us: 2.908% #
600us - 700us: 1.372%
700us - 800us: 0.786%
800us - 900us: 0.537%
900us -1h0m0s: 4.023% ##
Requests per second: 84233
Test duration: 11.871691529s
Avg response time: 375.705us
Min response time: 24.086us
Max response time: 49.169658ms
Cache miss count: 10
Cache hit count: 899878
Cache miss ratio: 0.001%
Errors count: 0
go-memcached:
$ ./go-memcached-bench -maxResponseTime=1ms -workersCount=32 -serverAddrs=127.0.0.1:11212 -workerMode=GetSet
Config:
clientType=new
connectionsCount=4
getRatio=0.9
goMaxProcs=4
ioTimeout=10s
itemsCount=100000
keySize=30
maxPendingRequestsCount=4096
maxResponseTime=1ms
osReadBufferSize=229376
osWriteBufferSize=229376
readBufferSize=57344
requestsCount=1000000
responseTimeHistogramSize=10
serverAddrs=127.0.0.1:11212
valueSize=200
workerMode=GetSet
workersCount=32
writeBufferSize=57344
Preparing...done
starting...done
Response time histogram
0 - 100us: 9.814% #####
100us - 200us: 35.089% #####################
200us - 300us: 34.599% ####################
300us - 400us: 12.767% #######
400us - 500us: 3.138% #
500us - 600us: 1.341%
600us - 700us: 0.716%
700us - 800us: 0.428%
800us - 900us: 0.307%
900us -1h0m0s: 1.802% #
Requests per second: 118365
Test duration: 8.305726463s
Avg response time: 261.493us
Min response time: 23.009us
Max response time: 38.978721ms
Cache miss count: 16896
Cache hit count: 883178
Cache miss ratio: 1.877%
Errors count: 0
У меня получаются абсолютно идентичные цифры с легким перевесом в пользу мемкеша и с значительно лучшими резултатами в плане cache missed ratio:
memcached:
memcached -t 12 -c 22288 -m 140
Response time histogram
0 - 100us: 50.758% ##############################
100us - 200us: 36.667% ######################
200us - 300us: 8.358% #####
300us - 400us: 2.246% #
400us - 500us: 0.729%
500us - 600us: 0.265%
600us - 700us: 0.106%
700us - 800us: 0.051%
800us - 900us: 0.024%
900us -1h0m0s: 0.796%
Requests per second: 62737
Test duration: 10.154665976s
Avg response time: 164.866us
Min response time: 26.222us
Max response time: 63.195655ms
Cache miss count: 1362928
Cache hit count: 436648
Cache miss ratio: 75.736%
Errors count: 0
gomemcache:
Preparing...done
starting...done
Response time histogram
0 - 100us: 63.424% ######################################
100us - 200us: 28.548% #################
200us - 300us: 5.205% ###
300us - 400us: 1.646%
400us - 500us: 0.592%
500us - 600us: 0.232%
600us - 700us: 0.085%
700us - 800us: 0.037%
800us - 900us: 0.023%
900us -1h0m0s: 0.209%
Requests per second: 62551
Test duration: 6.663772302s
Avg response time: 109.628us
Min response time: 25.987us
Max response time: 9.972696ms
Cache miss count: 1583177
Cache hit count: 216845
Cache miss ratio: 87.953%
./memcached-bench -maxResponseTime=1ms -workersCount=32 -serverAddrs=127.0.0.1:11211 -workerMode=GetSet -itemsCount=2000000 -requestsCount=2000000 -<blockquote>getRatio=0.9</blockquote>
При этом если я пытаюсь увеличить количество айтемов или реквестов, твоя гавнопрограмма падает с ошибками вроде: panic: runtime error: makeslice: len out of rangeСпасибо за багрепорт — исправил.
Насчет большого количество cache miss ratio у go-memcached-bench — попробуйте увеличить количество памяти под кэш ( параметр cacheSize, значение по умолчанию 64 Мб) и максимальное количество айтемов, которые может запомнить кэш ( параметр maxItemsCount, значение по умолчанию 1М ). А не то вы пытаетесь записать в маленький кэш 2М айтемов.
Я выставил мемкешу столько же памяти сколько потребляет твое поделие, то что твое решение менее рационально использует память, не моя вина.
Мне удалось воспроизвести ваши результаты по Cache miss ratio только при maxItemsCount=1M. Если же запустить go-memcached с maxItemsCount=2M, то Cache miss ratio снизится до 74%, а количество запросов в секунду увеличится на 30%.
Также столь высокий уровень кэш-промахов получается из-за того, что вы пытаетесь записать valueSize*itemsCount=200*2M=400Mб данных в 140Мб памяти.
Мне удалось воспроизвести ваши результаты по Cache miss ratio только при maxItemsCount=1M. Если же запустить go-memcached с maxItemsCount=2M, то Cache miss ratio снизится до 74%, а количество запросов в секунду увеличится на 30%.Я попробовал, но оно и памяти стало кушать намного больше, т.е. я считаю корректным предыдущий бенчмарк, когда оба кеша едят одинаково памяти.
Также столь высокий уровень кэш-промахов получается из-за того, что вы пытаетесь записать valueSize*itemsCount=200*2M=400Mб данных в 140Мб памяти.Ну да, это ведь кеш а не in memory db.
Ну и твой Г-код поддерживать врагу не посоветуешь.
Иначе кто-то из нас пиздобол :)
Ты смешной такой, у тебя там 80% текста — копипаст одного и тогоже куска текста, зачем функции в программировании нужны ты еще в школе не проходил??
defer wg.Done()
var item memcache_new.Item
for _ = range ch {
n := rand.Intn(*itemsCount)
item.Key = []byte(fmt.Sprintf("miss_%s_%d", key, n))
startTime := time.Now()
if err := client.Get(&item); err != memcache_new.ErrCacheMiss {
stats.errorsCount++
continue
}
stats.cacheMissCount++
updateResponseTimeHistogram(stats, startTime)
}
Наверное для вызова функции/метода тратится АЖ ОДИН дополнительный такт процессора, а копипаста спасает от этого :-)
Тогда виноват, ошибся.
А что тогда бенчмарк показывает когда демонстирует почти
Я хочу сам как нибудь на досуге поиграться с его бенчмарком, тогда и посмотрим.
Но вообще мемкешед слегка сложнее штуковина чем его кеш, оно например поддерживат compare and swap и еще кучу команд
Но вообще мемкешед слегка сложнее штуковина чем его кеш, оно например поддерживат compare and swap и еще кучу командОпять кто-то пиздоболит. go-memcached поддерживает compare and swap — см. github.com/.../server.go#L449 . go-memcached не поддерживает только совсем никому не нужные команды — см. FAQ в github.com/...memcache/README .
Звиздец, это уже диагноз, я должен шарится по срц-ам что бы посмотреть АПИ? Ну и то что ты 80% АПИ назвал ненужным тоже как бы показательно.
Ты смешной такой, у тебя там 80% текста — копипаст одного и тогоже куска текста, зачем функции в программировании нужны ты еще в школе не проходил??
Я не знаю, как тут без копипасты обойтись. Может, покажешь? Присылай pull request или на худой конец сюда скинь небольшой кусочек кода, чтобы я уловил идею.
У тебя не хватает ума додуматься как можно слить две практически одинаковые функции? Это прекрасно.
Коментар порушує правила спільноти і видалений модераторами.
быстрый кэширующий http-прокси для статического контента небольших размеров (картинки, js, css, mp3). Быстрее nginx’а :)Вот после этой фразы сразу возникает вопрос: что такое по вашему nginx, какие его основные функции и преимущества — и для чего его используют.
Я имел ввиду, что go-cdn-booster быстрее nginx’а в роли кэшрующего http-прокси для статического контента. Выше приведены сравнительные результаты тестов для go-cdn-booster’а и nginx’а именно в этой роли.
Пройдемся по основным преимуществам nginx’а, применимым к роли кэширующего http-прокси для статического контента.
Кроме того, go-cdn-booster предоставляет дополнительные возможности, отсутствующие в nginx либо в его настройках по умолчанию:
сравните ~350 строчек кода go-cdn-boosterНе-не-не, зачем опять лапшу на уши вешать, невооруженным глазом видно что бустер тянет за собой кучу гавнокода из ybc.
ybc — это библиотека функций для кэширования. Для расширения функциональности http-прокси вряд ли придется копаться внутри этой библиотеки.
Если следовать вашей логике, то «невооруженным глазом видно, что бустер тянет за собой кучу гавнококода из bufio, flag, fmt, io, log, net, runtime, strconv, strings, sync, time, а nginx тянет за собой кучу говнокода из стандартных библиотек C».
Для расширения функциональности http-прокси вряд ли придется копаться внутри этой библиотеки.Не понял, твое поделие уже претендует на отсутствие ошибок и протестированность на 100500 миллионах продакшн деплойментов как в случае с nginx?
Если следовать вашей логике, то «невооруженным глазом видно, что бустер тянет за собой кучу гaвнoкокода из bufio, flag, fmt, io, log, net, runtime, strconv, strings, sync, time, а nginx тянет за собой кучу гвнокода из стандартных библиотек C».В нгинкс как раз большинство из того что ты перечислил уже включено тобой в «100500 строчек исходников» в github.com/...master/src/core, так что да, твое сравнение становится еще более некоректным.
Желаю успеха в продвижении и попадании на продакшн реальных больших проектов.
Однако для этого стоит учитывать не только собственных критерии оценки.
Я весь проект перекомпиливаю максимум раз в день, а ты любишь компилить целыми днями?
Что еще?
Я бы предпочел секси подругу а не хорька. Хотя каждому свое, на вкус и цвет..
а секси-подруга предпочтёт хорька, так что go — вне конкуренции.
Временем старта (если бы я писал какую-то консольную тулзу, тот же мавен, я бы предпочел бы не-jvm язык, про nailgun в курсе), меньшим количеством концепций языка.
Временем старта (если бы я писал какую-то консольную тулзу, тот же мавен, я бы предпочел бы не-jvm язык, про nailgun в курсе)Ну да, где то там и есть ниша го, толкаться с питоном и руби в области консольных тулзей на 50 строк кода.
меньшим количеством концепций языка.Мне это вообще понравилось, эти извращенцы выкинули ексепшны и дженерики, как без них жить?
естьОн точно математик © Дал абсолютно верный и абсолютно бесполезный ответ.
Я не разработчик, но могу помочить с организацией какого-нибудь ивента(:
Мне эта тема интересна.
Если, что видела вакансии в Одессе — т.е. разработчики там есть.
когда в руках молоток, все похоже на гвоздь
предлагаю создать сообщество, собираться периодически, обмениваться опытом, идеями по Go.гвозди шалёвочные есть?
Есть идея сделать небольшую уютную конфу по такой вот маргинальщине (Go, Erlang, Lua т.д. — то, что встречается довольно редко, но тем не менее существует в коммерческой разработке). Поискать людей с коммерческий проектах — чтобы они рассказали как их занесло и что из этого вышло. Ну и познакомится — пообщаться с сочувствующими(:
Lua бачив не раз, так що напевно не дуже вона і маргінальна. Можна до списку докинути D.
луа часто используется в разработке игр — не редкий гость, любителям хомячка сочувствую.
имхо, перечисленные языки между собой слабо пересекаются.
Лучше найти плоскость где они пересекаются и/или взаимодействуют.
не розумію, чому Go — це „маргінальніще” :)
docker, kubernetes, terraform, influxdb, cockroachdb, etcd, consul... etc.
Есть идея сделать небольшую уютную конфу по такой вот маргинальщине (Go, Erlang, Lua
идея интересная. но:
1. Упомянутые языки не настолько маргинальщина, как можно подумать)
2. Если по маргинальщине, то тогда уже что-то типа D, Idris, Nim, Scheme. Хоть они между собой корелируются примерно также как Go с Lua и Эрлангом, но согласитесь, что они более маргинальны. :)
3. А где эта конфа будет проходить (в каком городе)? (если такую конфу можно провести в Одессе — я бы пошел :-) ).
78 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів