
v
12.05.2017
14:32:12
ну бери kv базу данных и не парься

Alex
12.05.2017
14:32:16
ну строго говоря в редисе удобно считать таблицы рейтингов например
другое дело что памяти нужно полно

v
12.05.2017
14:32:52

Google

Ivan
12.05.2017
14:34:20
Да это все реализовано, у меня вопросы по производительности.. после того, как коннектов становится много (от 400) он начинает долго думать.. т.е. я понимаю, что дело в очереди т.к. он работает в один поток, но.. вообще не понимаю, как решить проблему т.к. у меня есть только список SLOWLOG
запросов на соединение примерно 20

Alex
12.05.2017
14:34:51
как тебе вариант - не отсоединяться?

Ivan
12.05.2017
14:34:54
да, и используются разные штуки, типа pipline
Да, но тут фишка в том, что основной проект на Ruby написан, а вот API - на php (он очень легким быть должен, чем и является), код быстр, генерация примерно 10мс
точнее не генерация, а ответ

Alex
12.05.2017
14:36:17
php? ?
если легким и шустрым, может Go? (не юзал)

Ivan
12.05.2017
14:36:38
Не несчастью?ъ
Да, на новую технологию переходить не было возможности..

Slava
12.05.2017
14:37:19
так у тебя на каждый реквест создается новое соединение?

Ivan
12.05.2017
14:37:29
там есть свои подводные камни, а проект должен быть стабилен постоянно;;

Google

Ivan
12.05.2017
14:38:07
в Redis говорят, что кол-во соединений около 4-5к никак не влияют на производительность

Alex
12.05.2017
14:38:36
докер юзаешь?
может в нём бутылочное горлышко?

Ivan
12.05.2017
14:39:03
Нет, не докер, отдельно выделенный инстанс под redis
Вот сегодня, допустим. Мало запросов (в 2 раза меньше среднего), но вот ответы..

Slava
12.05.2017
14:40:12
если у тебя там какой-то простой скрипт, то просто запусти его в бесконечном цикле чтобы он принимал реквесты, а перед циклом открой соединение.
потом запусти как тебе удобно этот скрипт, например, в 100 потоков (я не знаю сколько надо). и не будет проблемы с коннектами.

Ivan
12.05.2017
14:40:15

Alex
12.05.2017
14:40:22
в php есть react-php
пускай он у тебя отдает ответы, чтобы соединения не городить
того же эффекта можно добиться с EM думаю.

Ivan
12.05.2017
14:41:02

Alex
12.05.2017
14:41:04
(event-machine)

Ivan
12.05.2017
14:41:07
а нет
phpredis

Alex
12.05.2017
14:41:14
что значит его юзаешь?
react-php это эвентлюп
это как ноду запустить ток php
чтобы php не спавнился и не подключался каждый раз заново, городя оверхэд на соединения.
а так как ты рубист, то может вообще на EM переписать?

Google


Ivan
12.05.2017
14:44:38
Сейчас постараюсь описать то, что я понял на данный момент. Я не использую ничего, что может лочить очередь redis т.е. кол-во соединений никак повлиять не может на это.. общался с людьми, которые так же используют redis, но для более высоконагруженных сервисов в качестве cache storage (там тоже PHP, и работают так же, и проблем не наблюдается).. может быть все дело в настройках redis?
сейчас скину парочку
Вот info
# Server
redis_version:3.2.1
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:8ab9de078b62748e
redis_mode:standalone
os:Linux 4.8.0-30-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:5.4.0
process_id:11596
run_id:04ee680b9d067e5094a4bcb5270993d0fe6d90aa
tcp_port:6379
uptime_in_seconds:50713
uptime_in_days:0
hz:10
lru_clock:1427369
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf
# Clients
connected_clients:407
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:106390424
used_memory_human:101.46M
used_memory_rss:120041472
used_memory_rss_human:114.48M
used_memory_peak:122821896
used_memory_peak_human:117.13M
total_system_memory:8370909184
total_system_memory_human:7.80G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.13
mem_allocator:jemalloc-3.6.0
# Persistence
loading:0
rdb_changes_since_last_save:10699
rdb_bgsave_in_progress:0
rdb_last_save_time:1494599432
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:2
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:4567315
total_commands_processed:59466535
instantaneous_ops_per_sec:1765
total_net_input_bytes:4358738262
total_net_output_bytes:12634509923
instantaneous_input_kbps:129.06
instantaneous_output_kbps:383.82
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:2062854
evicted_keys:0
keyspace_hits:32327857
keyspace_misses:7197779
pubsub_channels:3
pubsub_patterns:0
latest_fork_usec:34394
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:4685.29
used_cpu_user:2762.45
used_cpu_sys_children:21.72
used_cpu_user_children:87.38
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=339298,expires=134566,avg_ttl=30442950
db5:keys=1203,expires=785,avg_ttl=1687703
slowlog
1) 1) (integer) 3620
2) (integer) 1494600294
3) (integer) 12061
4) 1) "HGETALL"
2) "users:token:c1a09372-da16-11e6-aa13-9fcea395a164"
2) 1) (integer) 3619
2) (integer) 1494600292
3) (integer) 19563
4) 1) "HGETALL"
2) "users:token:bab0ae4a-df42-11e6-aa14-f3029310ddd1"
3) 1) (integer) 3618
2) (integer) 1494600280
3) (integer) 13205
4) 1) "HGETALL"
2) "sessions:97559b4a-1c87-11e7-aa2d-bf49c5e1089e"
4) 1) (integer) 3617
2) (integer) 1494600273
3) (integer) 23289
4) 1) "HGETALL"
2) "sessions:6e115b12-237f-11e7-aa41-0702fa902471"
5) 1) (integer) 3616
2) (integer) 1494600256
3) (integer) 11269
4) 1) "HGETALL"
2) "sessions:110e0dc2-29c2-11e7-aa69-03edcae7d26f"
данные по токенам не приватные, так что нет разницы в том, что они будут тут)
по HGETALL всего 3 филда т.е. сложность O(N); N =3


Slava
12.05.2017
14:47:58
редис тут не причем, если я все правильно понял.
что угодно (rdbms, небо, аллах) будет тупить, если ты будешь сотни коннектов ежесекундно к нему открывать (кстати, ты их закрываешь? на всякий уточняю)

Ivan
12.05.2017
14:48:17
Да, закрываю
не думал, что сотни коннектов для ПО, которое работает на VPS с RAM 8GB - проблема
и то, что в большинстве случаев это только чтение

Slava
12.05.2017
14:49:30
так ведь ты не держишь их в памяти, если я верно понял

Ivan
12.05.2017
14:49:41
Держу
VPS только для Redis и используется, и он работает только с оперативной памятью, снэпшоты делает раз в 15 мин

Slava
12.05.2017
14:50:58
Держу
немного выше ты подтвердил, что на каждый реквест открывается новое соединение.
видимо мы друг друга не так поняли :)

Ivan
12.05.2017
14:51:36
Я думал, ты о данных в redis, так что да)
Вот по redis инстансу
т.е. ему там совсем свободно
инстансы общаются по локальной сети, пинг минимальный

Google

Ivan
12.05.2017
14:53:59
?
перечитал тонну доков, до сих пор в засаде остаюсь

Slava
12.05.2017
14:54:45
когда-то возился с rabbitmq, возможно в редисе что-то такое тоже есть: там надо в ОС увеличить всяческие лимиты. быть может ты напоролся на подобные ограничения.
секция Controlling System Limits on Linux:
https://www.rabbitmq.com/install-debian.html

Ivan
12.05.2017
14:56:15
Вот кстати, rabbitmq работает вообще идеально на соседнем

Admin
ERROR: S client not available

Slava
12.05.2017
14:56:23
еще из очевидного: зачем тебе 400 коннектов при 500 rps?
сделай connection pool.

Ivan
12.05.2017
14:56:27
и у него всего 1GB RAM

Lupsick
12.05.2017
15:18:59
def channel_to_members
users = bot_api.users_list["members"].map { |u| [u['id'], u] }.to_h
((bot_api.channels_list.try(:[], "channels") || []).map { |c| [c['id'], c['members'] || []] } +
(bot_api.groups_list.try(:[], "groups") || []).map { |c| [c['id'], c['members'] || []] } +
(bot_api.im_list.try(:[], "ims") || []).select{|im| im["user"] != "USLACKBOT"}.map{ |im| [im['id'], [im['user']]] }).map do |k, v|
[k, v.select do |u|
profile = users[u]
!profile['deleted'] && !profile['is_bot']
end]
end.to_h
end
что в приличном обществе делают за такой код?


Alexander
12.05.2017
15:21:44
def channel_to_members
users = bot_api.users_list["members"].map { |u| [u['id'], u] }.to_h
((bot_api.channels_list.try(:[], "channels") || []).map { |c| [c['id'], c['members'] || []] } +
(bot_api.groups_list.try(:[], "groups") || []).map { |c| [c['id'], c['members'] || []] } +
(bot_api.im_list.try(:[], "ims") || []).select{|im| im["user"] != "USLACKBOT"}.map{ |im| [im['id'], [im['user']]] }).map do |k, v|
[k, v.select do |u|
profile = users[u]
!profile['deleted'] && !profile['is_bot']
end]
end.to_h
end
что в приличном обществе делают за такой код?
да ладно тебе, всего-то 16 warnings на 11 строк кода ?

Lupsick
12.05.2017
15:22:10
да варнинги это второстепенная хуйня
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.

Ivan
12.05.2017
16:29:32
жесть, добавил опции "сохранения" соединения, отвалился PostgreSQL (\PDO::ATTR_PERSISTENT => true) с ошибкой - FATAL: sorry, too many clients already FATAL: sorry, too many clients already)
Норм)

Dmitry
13.05.2017
00:17:56
Всем привет! Подскажите, какие можно использовать джемы или отдельные утилиты, чтобы сгенерировать документацию по api, сделанному с помощью рельсов?

Vitaliy
13.05.2017
00:20:09
Apipie, swagger

Dmitry
13.05.2017
00:22:48
с ними как раз вожусь сейчас - значит на верном пути, спасибо)

Alex
13.05.2017
05:17:57
для небольших API очень крут.
а с Apipie у меня была боль и страдания.

Igor
13.05.2017
06:57:43

Google

Dima
13.05.2017
08:20:41

Alex
13.05.2017
09:24:01

Danny
13.05.2017
14:29:08
Всем привет!
Сделал я локализацию на рус. язык
Как тепер включить ее?

Dmitry
13.05.2017
14:32:55
Привет! В конфиге приложения или среды прописать config.i18n.default_locale.

Ivan
13.05.2017
14:33:00
I18n.locale = :ru

Lupsick
13.05.2017
14:33:38

Ivan
13.05.2017
14:33:59
http://guides.rubyonrails.org/i18n.html#managing-the-locale-across-requests

Danny
13.05.2017
14:37:37
Cgfcb,j!
Спасибо!

Sergey
13.05.2017
17:03:39
@pimpmyyoba подключите в проект rubocop плюс плагин к атому/сублайму - такой жести не будет

Lupsick
13.05.2017
17:04:04

Sergey
13.05.2017
17:04:54
Но рубокоп такой код бы не пропустил ?

Lupsick
13.05.2017
17:16:00

Klim
13.05.2017
19:33:36
Светик, ты нас будешь спамить или рекрутить?

v
13.05.2017
19:34:38
она, по ходу, программировать на руби будет