gt06_server 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +3 -0
- data/.rubocop.yml +4 -0
- data/Gemfile.lock +5 -2
- data/Note.md +20 -0
- data/README.md +6 -4
- data/lib/gt06_server.rb +1 -1
- data/lib/gt06_server/server.rb +3 -3
- data/lib/gt06_server/session.rb +6 -3
- data/lib/gt06_server/{session_killer.rb → session_sweeper.rb} +1 -2
- data/lib/gt06_server/version.rb +1 -1
- data/memory_bloat.png +0 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6badba6dc484656af3c748b440f056939d3c805
|
4
|
+
data.tar.gz: db9fc1cc01be0b01f459f79dcd1e454ae12f8ba3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d0448a5b3a64627a81d6944afef86858be10818b935513d6754749f7d99b0fd347ac64ede06af5264fbfd140146305f0a3cf3cee1ab173aec841a4ad0a8ca60
|
7
|
+
data.tar.gz: 9a4dd20d39938f850ac5876d424b583f88a773a5997608cfc7d003d5c2d533bab69dd65fb98644b3fe4d171f42ac3f20621e456b84ff4b9a9dffd7e4ff6b809a
|
data/.codeclimate.yml
CHANGED
data/.rubocop.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -4,7 +4,7 @@ PATH
|
|
4
4
|
gt06_server (0.0.1)
|
5
5
|
bindata (~> 2.3)
|
6
6
|
celluloid-io (~> 0.17.3)
|
7
|
-
concurrent-ruby (
|
7
|
+
concurrent-ruby (~> 1.0)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
@@ -60,12 +60,14 @@ GEM
|
|
60
60
|
coercible (1.0.0)
|
61
61
|
descendants_tracker (~> 0.0.1)
|
62
62
|
concurrent-ruby (1.0.2)
|
63
|
+
concurrent-ruby (1.0.2-java)
|
63
64
|
descendants_tracker (0.0.4)
|
64
65
|
thread_safe (~> 0.3, >= 0.3.1)
|
65
66
|
docile (1.1.5)
|
66
67
|
equalizer (0.0.11)
|
67
68
|
ffi (1.9.10-java)
|
68
69
|
hitimes (1.2.4)
|
70
|
+
hitimes (1.2.4-java)
|
69
71
|
i18n (0.7.0)
|
70
72
|
ice_nine (0.11.2)
|
71
73
|
json (1.8.3)
|
@@ -76,6 +78,7 @@ GEM
|
|
76
78
|
net-ssh (>= 2.6.5)
|
77
79
|
net-ssh (3.2.0)
|
78
80
|
nio4r (1.2.1)
|
81
|
+
nio4r (1.2.1-java)
|
79
82
|
parser (2.3.1.2)
|
80
83
|
ast (~> 2.2)
|
81
84
|
powerpack (0.1.1)
|
@@ -145,4 +148,4 @@ DEPENDENCIES
|
|
145
148
|
rubocop
|
146
149
|
|
147
150
|
BUNDLED WITH
|
148
|
-
1.
|
151
|
+
1.13.1
|
data/Note.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Note
|
2
|
+
Из интересных моментов в разработке - пришлось искать причину “утечки памяти”
|
3
|
+
Локальные нагрузочные тесты не принесли результатов, пришлось реализовать мониторинг памяти и работы gc в боевой среде.
|
4
|
+
|
5
|
+
Для этого я реализовал простенький [gem (memory_monitor_client)](https://github.com/CoolElvis/memory_monitor_client) который с заданным интервалом кидает по udp статистику gc и rss. Для агрегации я использовал logstash + kibana.
|
6
|
+
|
7
|
+
Проанализировав полученные данные я обнаружил, что количество объектов растет пропорционально памяти, ничего не обычного. Следующий шаг был посчитать количество соединений на сервере. Настроив сбор данной статистики, обнаружилось, что количество открытых соединений непрерывно растет, хотя было известно, что количество клиентов ограничено.
|
8
|
+
|
9
|
+
Возникла гипотеза - некоторые сессии просто висят в открытом состоянии, но при этом не шлют никаких данных. Специфика данной ситуации в том, что связь на устройствах не стабильна, так как устройство постоянно перемещается (установлено на автомобиле), причем часто в зонах не уверенного приема сети.
|
10
|
+
|
11
|
+
Чтобы проверить гипотезу, я реализовал механизм [session_sweeper](https://github.com/CoolElvis/gt06_server/blob/master/lib/gt06_server/session_sweeper.rb), который с заданным интервалом пробегает по списку сессий и закрывает, те сессии, по которым за определенный тайм-аут не пришло никаких данных. Причем закрывать соединение не через “close”, а через “reset”.
|
12
|
+
|
13
|
+
На графике видно как изменилось количество сессий, объектов и соответственно количество памяти.
|
14
|
+
|
15
|
+
![](memory_bloat.png)
|
16
|
+
|
17
|
+
По графику можно сделать вывод, что существует сравнительно большое количество “мертвых” соединений.
|
18
|
+
|
19
|
+
Можно сделать вывод, что контроль за “мертвыми” соединениями необходимо делать на всех серверах, которые имеют дело с “долгими” клиентами. Нет никаких гарантий, что соединение корректно закроется со стороны клиента.
|
20
|
+
Полагаю, что в большинстве серверов такого типа подобным механизм реализован.
|
data/README.md
CHANGED
@@ -25,7 +25,7 @@ require 'gt06_server'
|
|
25
25
|
|
26
26
|
log_path = File.expand_path(File.join(File.dirname(__FILE__), 'log/server.log'))
|
27
27
|
|
28
|
-
Gt06Server::Server.run
|
28
|
+
Gt06Server::Server.run('0.0.0.0', 9000, options: { logger: Logger.new(log_path) }) do |message|
|
29
29
|
p message
|
30
30
|
end
|
31
31
|
|
@@ -36,11 +36,13 @@ sleep
|
|
36
36
|
The message is a Hash like:
|
37
37
|
|
38
38
|
````ruby
|
39
|
-
{
|
39
|
+
{
|
40
|
+
:packet_length => 10,
|
40
41
|
:protocol_number => 19,
|
41
42
|
:message_type => :status_information,
|
42
43
|
:information_content =>
|
43
|
-
{
|
44
|
+
{
|
45
|
+
:terminal_information =>
|
44
46
|
{
|
45
47
|
:electricity_bit => 0,
|
46
48
|
:gps_bit => 0,
|
@@ -57,5 +59,5 @@ The message is a Hash like:
|
|
57
59
|
:serial_number => 48
|
58
60
|
}
|
59
61
|
````
|
60
|
-
The content of 'information_content' depends on 'message_type'
|
62
|
+
The content of 'information_content' depends on 'message_type'
|
61
63
|
See lib/gt06_server/messages for details
|
data/lib/gt06_server.rb
CHANGED
@@ -3,6 +3,6 @@ require_relative 'gt06_server/version'
|
|
3
3
|
require_relative 'gt06_server/crc'
|
4
4
|
require_relative 'gt06_server/packet'
|
5
5
|
require_relative 'gt06_server/protocol'
|
6
|
-
require_relative 'gt06_server/
|
6
|
+
require_relative 'gt06_server/session_sweeper'
|
7
7
|
require_relative 'gt06_server/session'
|
8
8
|
require_relative 'gt06_server/server'
|
data/lib/gt06_server/server.rb
CHANGED
@@ -39,10 +39,10 @@ module Gt06Server
|
|
39
39
|
|
40
40
|
@sessions = Concurrent::Map.new
|
41
41
|
|
42
|
-
|
43
|
-
|
42
|
+
sweeper = SessionSweeper.new(@sessions, options.fetch(:session_timeout, nil), interval: options.fetch(:sweep_interval, nil))
|
43
|
+
sweeper.run
|
44
44
|
|
45
|
-
@info = {
|
45
|
+
@info = { sweeper_info: sweeper.info }
|
46
46
|
|
47
47
|
async.run handler
|
48
48
|
end
|
data/lib/gt06_server/session.rb
CHANGED
@@ -17,7 +17,7 @@ module Gt06Server
|
|
17
17
|
# @yield [Hash] information_content of packet
|
18
18
|
# @raise EOF
|
19
19
|
def run(&block)
|
20
|
-
|
20
|
+
handle_head_pack(Protocol.read_pack(@io))
|
21
21
|
|
22
22
|
loop do
|
23
23
|
handle_main_pack(Protocol.read_pack(@io), &block)
|
@@ -26,7 +26,7 @@ module Gt06Server
|
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
-
def
|
29
|
+
def handle_head_pack(pack)
|
30
30
|
if pack.payload.message_type != :login_message
|
31
31
|
raise SessionError, 'Expect login message first but received: ' + pack.to_hex
|
32
32
|
end
|
@@ -42,10 +42,13 @@ module Gt06Server
|
|
42
42
|
def handle_main_pack(pack, &block)
|
43
43
|
logger.debug "terminal_id: #{@terminal_id} , info #{@info}, message: #{pack}"
|
44
44
|
@info[:received_count] += 1
|
45
|
+
@info[:last_received_at] = Time.now
|
46
|
+
|
45
47
|
|
46
48
|
block.yield(pack.payload)
|
47
49
|
|
48
|
-
|
50
|
+
ack_pack = Protocol.replay_on(pack)
|
51
|
+
if (ack_pack)
|
49
52
|
@io.write(ack_pack.to_binary_s)
|
50
53
|
@info[:sent_count] += 1
|
51
54
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'concurrent'
|
2
2
|
|
3
|
-
class
|
3
|
+
class SessionSweeper
|
4
4
|
attr_reader :sessions , :info, :timeout, :interval
|
5
5
|
|
6
6
|
def initialize(sessions, timeout = 60, interval: 30)
|
@@ -27,7 +27,6 @@ class SessionKiller
|
|
27
27
|
@info[:count] += 1
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
30
|
timer.execute
|
32
31
|
end
|
33
32
|
|
data/lib/gt06_server/version.rb
CHANGED
data/memory_bloat.png
ADDED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gt06_server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CoolElvis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- ".travis.yml"
|
96
96
|
- Gemfile
|
97
97
|
- Gemfile.lock
|
98
|
+
- Note.md
|
98
99
|
- README.md
|
99
100
|
- Rakefile
|
100
101
|
- gt06_server.gemspec
|
@@ -114,10 +115,11 @@ files:
|
|
114
115
|
- lib/gt06_server/protocol.rb
|
115
116
|
- lib/gt06_server/server.rb
|
116
117
|
- lib/gt06_server/session.rb
|
117
|
-
- lib/gt06_server/
|
118
|
+
- lib/gt06_server/session_sweeper.rb
|
118
119
|
- lib/gt06_server/version.rb
|
119
120
|
- lib/libcrc16.rb
|
120
121
|
- lib/libcrc_16.so
|
122
|
+
- memory_bloat.png
|
121
123
|
homepage: https://github.com/CoolElvis/gt06_server
|
122
124
|
licenses:
|
123
125
|
- MIT
|