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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b78ca30efa3569ad2d506db73e1fb407cbc9655d
4
- data.tar.gz: 4be9efbb31e2e8bf02d5ce0f609d1f3a55bf73e3
3
+ metadata.gz: a6badba6dc484656af3c748b440f056939d3c805
4
+ data.tar.gz: db9fc1cc01be0b01f459f79dcd1e454ae12f8ba3
5
5
  SHA512:
6
- metadata.gz: 7a3c0643ec2b53e282c7bcac7691c8a1c9d4a2582257871a92b8b0710b6fbf2c023c5c017261f8624247f24dcc88c7a643c5ad760cd259b315dd21a0f3cf45a4
7
- data.tar.gz: c0f4251eae69690753bedbcdef6996b8270340ef90aeab04b27f900f877c2bb78e1a5fbb95980f06105dd7e0774f3217ecd3536a35db1115c3455a1fa423be31
6
+ metadata.gz: 7d0448a5b3a64627a81d6944afef86858be10818b935513d6754749f7d99b0fd347ac64ede06af5264fbfd140146305f0a3cf3cee1ab173aec841a4ad0a8ca60
7
+ data.tar.gz: 9a4dd20d39938f850ac5876d424b583f88a773a5997608cfc7d003d5c2d533bab69dd65fb98644b3fe4d171f42ac3f20621e456b84ff4b9a9dffd7e4ff6b809a
data/.codeclimate.yml CHANGED
@@ -8,6 +8,9 @@ engines:
8
8
  enabled: true
9
9
  rubocop:
10
10
  enabled: true
11
+ checks:
12
+ Rubocop/Style/CommentIndentation:
13
+ enabled: false
11
14
  reek:
12
15
  enabled: true
13
16
  ratings:
data/.rubocop.yml CHANGED
@@ -26,3 +26,7 @@ Style/AsciiComments:
26
26
  Style/Documentation:
27
27
  Description: 'Document classes and non-namespace modules.'
28
28
  Enabled: false
29
+
30
+ Style/CommentIndentation:
31
+ Description: 'Indentation of comments.'
32
+ Enabled: fasle
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 (>= 1.0.2)
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.12.5
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 '0.0.0.0', 9000, logger: Logger.new(log_path) do |message|
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
- { :packet_length => 10,
39
+ {
40
+ :packet_length => 10,
40
41
  :protocol_number => 19,
41
42
  :message_type => :status_information,
42
43
  :information_content =>
43
- { :terminal_information =>
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/session_killer'
6
+ require_relative 'gt06_server/session_sweeper'
7
7
  require_relative 'gt06_server/session'
8
8
  require_relative 'gt06_server/server'
@@ -39,10 +39,10 @@ module Gt06Server
39
39
 
40
40
  @sessions = Concurrent::Map.new
41
41
 
42
- killer = SessionKiller.new(@sessions, options.fetch(:session_timeout, nil), interval: options.fetch(:killer_interval, nil))
43
- killer.run
42
+ sweeper = SessionSweeper.new(@sessions, options.fetch(:session_timeout, nil), interval: options.fetch(:sweep_interval, nil))
43
+ sweeper.run
44
44
 
45
- @info = { killer_info: killer.info }
45
+ @info = { sweeper_info: sweeper.info }
46
46
 
47
47
  async.run handler
48
48
  end
@@ -17,7 +17,7 @@ module Gt06Server
17
17
  # @yield [Hash] information_content of packet
18
18
  # @raise EOF
19
19
  def run(&block)
20
- handle_head_packet(Protocol.read_pack(@io))
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 handle_head_packet(pack)
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
- if (ack_pack = Protocol.replay_on(pack))
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 SessionKiller
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
 
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Gt06Server
3
- VERSION = '0.0.1'
3
+ VERSION = '0.0.2'
4
4
  end
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.1
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-08-02 00:00:00.000000000 Z
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/session_killer.rb
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