tweek 0.9.9 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6f72d6d59a8e68f01ced40dd39696822515e0d3
4
- data.tar.gz: 8b97932c5381d852aa09fcc0066d601b5df5c3bb
3
+ metadata.gz: 7068bcfbf27d73e5c1a20c2f5d52671a8d0ce968
4
+ data.tar.gz: 8458e63c00fd12cc564a7e7aa3198aecfefe65b7
5
5
  SHA512:
6
- metadata.gz: 284e773675805ef2882269ebea781d58f057c905292cd9e400905e7c7af3334d6d8bc5703531b91e6398e113400a56c8aaefe80217fdd1363c2013cfb8d2f283
7
- data.tar.gz: 6a9b3db52163945915d8923fd0e979db24a6a386568d8fc3a9ad9a07024a5120c2caeb1fee7b58c66f9100021b348d0fce442990b51342a6d506662dce3d2330
6
+ metadata.gz: c09dfbf71eca18073c90a87616d46084f2ec6572d659c5a23beaf9c1044e33d984030d30ac24ff74a4e871f066ddf994529373cfdbe3f69af018c06de22d2b84
7
+ data.tar.gz: 7c85c2be58f9a2de5383a7f5caa0c433d30678f6a46eb12e7a32191d0c91a65eba57858ef6bb7b07894659958ab9d98bb046836b179623f72c32b071182d890d
data/README.md CHANGED
@@ -5,7 +5,7 @@ be recorded and checked against a file of settings. Think of it as a series of
5
5
  configuration tests that can be executed, with the results being presented as a number of
6
6
  passes and failures. The number of failures is returned as the exit code of the process
7
7
  which allows it's use in scripts. This is particularly useful when checking multiple
8
- machines via a utility like `pssh` or `mush`.
8
+ machines using a utility like `pssh` or `mush`.
9
9
 
10
10
  Although existing configuration management systems such as Puppet, Chef or Ansible can
11
11
  perform the same checks, they tend to require a high level of support infrastructure to be
@@ -118,7 +118,7 @@ For a discussion of which parameters are supported please see the sample setting
118
118
 
119
119
  Parameter lines can be suffixed by the word `if` and one or more conditions. These are
120
120
  used to limit the scope of the parameter check to those systems where the condition(s) hold
121
- true. The list of conditions is logicall AND'ed together. A condition takes the form:
121
+ true. The list of conditions is logically AND'ed together. A condition takes the form:
122
122
 
123
123
  ```
124
124
  [k|d|v] op value
@@ -126,10 +126,10 @@ true. The list of conditions is logicall AND'ed together. A condition takes the
126
126
 
127
127
  Where:
128
128
  * `k` is the Kernel Version, `d` is the Distro name, and `v` is the Distro version.
129
- * The operator `op` can be: equality '==', regex equality '=~'or a version comparator as
129
+ * The operator `op` can be: equality `==`, regex equality `=~` or a version comparator as
130
130
  per the [Rubygems](http://ruby-doc.org/stdlib-2.0.0/libdoc/rubygems/rdoc/Gem/Version.html) specification.
131
- * The value is one of: a plain string in quotes (for equality), a regex between /
132
- delimiters, or a plain version string.
131
+ * The value is one of: a plain string in `'` quotes (for equality), a regex between `/`
132
+ delimiters, or a plain version string (eg. `4.3.1`).
133
133
 
134
134
  NOTE: The determination of the current Distro, Distro Version and Kernel Version is done
135
135
  using the `lsb_release` and `uname` commands. Since these may not be installed on all
data/bin/tweek CHANGED
@@ -9,7 +9,7 @@ require 'rubygems'
9
9
  require 'optparse'
10
10
  require 'ostruct'
11
11
  require 'tweek'
12
- require 'tweek/app'
12
+ require 'tweek/file'
13
13
  require 'tweek/version'
14
14
 
15
15
  trap('INT') do
@@ -83,7 +83,7 @@ if kernel_ver.nil?
83
83
  exit 2
84
84
  end
85
85
  end
86
- cs = Tweek::App.new(gflag, true, distro, distro_ver, kernel_ver)
86
+ cs = Tweek::File.new(gflag, true, distro, distro_ver, kernel_ver)
87
87
  if ARGV.empty?
88
88
  fh = File.open(File.expand_path('../../settings/sample.set',__FILE__))
89
89
  else
@@ -4,7 +4,7 @@ require 'ostruct'
4
4
  require 'tweek'
5
5
  require 'tweek/section'
6
6
 
7
- class Tweek::App
7
+ class Tweek::File
8
8
 
9
9
  attr_reader :distro, :distro_version, :kernel_version
10
10
 
@@ -22,12 +22,6 @@ class Tweek::App
22
22
  @tty = tty
23
23
  end
24
24
 
25
- # Define data-collection methods so we can easily stub them for tests
26
- #
27
- def self.bootline
28
- @bootline ||= File.open("/proc/cmdline", &:read).chomp rescue 'nowt'
29
- end
30
-
31
25
  def generate type, e
32
26
  return unless @gflag
33
27
  case type
@@ -37,11 +31,21 @@ class Tweek::App
37
31
  @generated.push "#{e.type} #{e.list} #{e.comment}"
38
32
  when :entry
39
33
  cond = e.cond.nil? ? "": " if #{e.cond}"
40
- comment = e.comment.nil? ? "#": e.comment
41
- if e.actual
42
- @generated.push "#{e.param} = #{e.actual}#{cond} #{comment} [expected #{e.value}]"
34
+ if e.actual.nil?
35
+ line = "#{e.param} = #{e.value}#{cond}"
36
+ note = "[condition not met]"
43
37
  else
44
- @generated.push "#{e.param} = #{e.value}#{cond} #{comment} [skipped]"
38
+ line = "#{e.param} = #{e.actual}#{cond}"
39
+ if e.value === e.actual
40
+ note = nil
41
+ else
42
+ note = "[expected #{e.value}]"
43
+ end
44
+ end
45
+ if e.comment.nil?
46
+ @generated.push (note ? line + " # " + note : line)
47
+ else
48
+ @generated.push (note ? line + " " + comment + " " + note : line + " " + comment)
45
49
  end
46
50
  end
47
51
  end
@@ -65,6 +69,7 @@ class Tweek::App
65
69
 
66
70
  def condfail cond
67
71
  return false unless cond
72
+ cond.strip!
68
73
  failures = 0
69
74
  reqs = cond.split(/\s*,\s*/)
70
75
  reqs.each do |req|
@@ -123,9 +128,13 @@ class Tweek::App
123
128
  next
124
129
  end
125
130
 
126
- if /^\s*(.+?)\s*=\s*(.*?)\s*(if\s+(.*))?$/ =~ line
127
- section.push OpenStruct.new( :lineno => handle.lineno, :param => $1, :value => $2,
128
- :cond => $4, :comment => comment )
131
+ if /^\s*(.+?)\s*=\s*(.*?)\s*(\bif\b(.*))?$/ =~ line
132
+ if $4 and $4.strip.empty?
133
+ error "#{handle.lineno}: Missing condition after 'if'"
134
+ else
135
+ section.push OpenStruct.new( :lineno => handle.lineno, :param => $1, :value => $2,
136
+ :cond => $4, :comment => comment )
137
+ end
129
138
  next
130
139
  end
131
140
  error "#{handle.lineno}: Unrecognized line: #{line}"
@@ -136,11 +145,14 @@ class Tweek::App
136
145
 
137
146
  def results
138
147
  STDERR.puts "\nDistro: #{@distro} Version: #{@distro_version} Kernel: #{@kernel_version}"
139
- STDERR.puts "\n#{@nparams} parameters checked, #{@skips.size} skipped, #{@mismatches.size} mismatches, #{@warns.size} warnings, #{@errors.size} errors"
148
+ STDERR.puts "\n#{@nparams} parameters checked, #{@skips.size} conditions not met, #{@mismatches.size} mismatches, #{@warns.size} warnings, #{@errors.size} errors"
140
149
  STDERR.puts "\n#{@errors.join("\n")}" unless @errors.empty?
141
150
  STDERR.puts "\n#{@warns.join("\n")}" unless @warns.empty?
142
151
  STDERR.puts "\n#{@mismatches.join("\n")}" unless @mismatches.empty?
143
- @generated.each { |l| STDOUT.puts l}
152
+ if @gflag
153
+ @generated.unshift "# Generated at #{Time.now.strftime("%c %Z")}\n# Distro: #{@distro} Version: #{@distro_version} Kernel: #{@kernel_version}"
154
+ @generated.each { |l| STDOUT.puts l}
155
+ end
144
156
  return @mismatches.size
145
157
  end
146
158
  end
data/lib/tweek/section.rb CHANGED
@@ -63,7 +63,7 @@ class Tweek::Section < Array
63
63
 
64
64
  devices.each do |blk|
65
65
  each_entry (cs) do |entry|
66
- entry.actual = File.open("/sys/block/#{blk}/queue/#{entry.param}", &:read).chomp rescue $!.message
66
+ entry.actual = Tweek.blk_param(blk, entry.param)
67
67
  if entry.param == 'scheduler'
68
68
  entry.actual = entry.actual.slice(/\[(.*?)\]/,1) unless entry.actual == 'none'
69
69
  end
@@ -74,7 +74,7 @@ class Tweek::Section < Array
74
74
 
75
75
  when 'KERNEL' # KERNEL PARAMETERS
76
76
  each_entry (cs) do |entry|
77
- actual = /\b(#{entry.param})(=\S+)?\b/.match(Tweek::App.bootline)
77
+ actual = /\b(#{entry.param})(=\S+)?\b/.match(Tweek.bootline)
78
78
  case
79
79
  when (entry.value == 'true' and actual)
80
80
  observed = actual.to_s
@@ -99,7 +99,7 @@ class Tweek::Section < Array
99
99
 
100
100
  when 'CLOCKSOURCE'
101
101
  each_entry (cs) do |entry|
102
- entry.actual=File.open("/sys/devices/system/clocksource/#{entry.param}/current_clocksource",&:read).chomp rescue $!.message
102
+ entry.actual = Tweek.clocksource(entry.param)
103
103
  cs.assert_equal entry.value, entry.actual, entry.param
104
104
  cs.generate :entry, entry
105
105
  end
@@ -107,7 +107,7 @@ class Tweek::Section < Array
107
107
  when 'SYSCTL' # SYSCTL SETTINGS
108
108
  each_entry (cs) do |entry|
109
109
  file = entry.param.gsub(/\./,'/')
110
- entry.actual = File.open("/proc/sys/#{file}", &:read).chomp.gsub(/\s+/,' ') rescue $!.message
110
+ entry.actual = Tweek.sysctl(file)
111
111
  cs.assert_equal entry.value, entry.actual, entry.param
112
112
  cs.generate :entry, entry
113
113
  end
@@ -121,84 +121,39 @@ class Tweek::Section < Array
121
121
 
122
122
  case entry.param
123
123
  when 'driver'
124
- entry.actual = File.basename(File.readlink("/sys/class/net/#{netdev}/device/driver"))
125
- cs.assert_equal entry.value, entry.actual, entry.param
124
+ entry.actual = Tweek.net_driver(netdev)
126
125
 
127
126
  when 'irqs'
128
127
 
129
- irqs=File.open("/proc/interrupts", &:readlines).grep(/\b#{netdev}\b/).map{|m| m.partition(':')[0].strip}
128
+ balpid = Tweek.balance_pid
130
129
 
131
- if irqs.empty?
132
- cs.warn "#{netdev} IRQ check skipped: none found"
133
- entry.actual = 'null'
134
- cs.generate :entry, entry
135
- next
136
- end
137
-
138
- ncores = `getconf _NPROCESSORS_ONLN`.chomp.to_i rescue 0
139
- mismatches = 0
140
- irqs.each_with_index do |irq, ix|
141
- case entry.value
142
- when 'null','none','ignore'
143
- next
144
-
145
- when 'aws'
146
- expected_rps = ("00000000," * 3) + "0000ff00"
147
- expected_rss = ("00000000," * 3) + sprintf("%08x", 1<<ix)
148
-
149
- when 'pin'
150
- case ncores
151
- when 32 # RPS on cores 10-15 and 18-31, RSS tied to 0-7
152
- case ix
153
- when 0..7
154
- expected_rps = ("00000000," * 3) + "fffefe00"
155
- expected_rss = ("00000000," * 3) + sprintf("%08x", 1<<(ix+1))
156
- else
157
- cs.warn "#{netdev} IRQ strategy '#{entry.value}' can't handle IRQ#{ix}"
158
- end
159
-
160
- when 64 # Split the work across the two nodes
161
- case ix
162
- when 0..3 # alloc on node 0 (cpus 0-3)
163
- expected_rps = ("00000000," * 2) + "0000ffff," + "0000ffe0"
164
- expected_rss = ("00000000," * 3) + sprintf("%08x", 1<<(ix+1))
165
- when 4..7 # alloc on node 1 (
166
- expected_rps = ("00000000," * 2) + "ffff0000," + "ffe00000"
167
- expected_rss = ("00000000," * 3) + sprintf("%08x", 1<<(ix + 9))
168
- else
169
- cs.warn "#{netdev} IRQ strategy '#{entry.value}' can't handle IRQ#{ix}"
170
- end
171
-
172
- else
173
- cs.error "#{entry.lineno}: Can't handle #{ncores} cores in IRQ strategy '#{entry.value}'"
174
- end
175
-
176
- else
177
- cs.error "#{entry.lineno}: Unrecognized #{netdev} IRQ strategy '#{entry.value}'"
178
- end
179
- actual_rss = File.open("/proc/irq/#{irq}/smp_affinity",&:read).chomp rescue $!.message
180
- actual_rps = File.open("/sys/class/net/#{netdev}/queues/rx-#{ix}/rps_cpus", &:read).chomp rescue $!.message
181
- mismatches += cs.assert_equal expected_rss, actual_rss, "#{netdev}_irq_#{irq}_rss"
182
- mismatches += cs.assert_equal expected_rps, actual_rps, "#{netdev}_irq_#{irq}_rps"
183
- end
184
- entry.actual = 'null' if mismatches > 0
130
+ if entry.value == 'balance'
131
+ entry.actual = balpid.zero? ? 'IRQ balance daemon not running' : 'balance'
132
+ else
133
+ if balpid.zero?
134
+ handle_irqs(netdev, cs, entry)
135
+ next
136
+ else
137
+ entry.actual = 'IRQ balance daemon running'
138
+ end
139
+ end
185
140
 
186
- else # try getting the name
141
+ else # treat the parameter as a name
187
142
  begin
188
- entry.actual = File.open("/sys/class/net/#{netdev}/#{entry.param}", &:read).chomp.gsub(/\s+/,' ')
189
- cs.assert_equal entry.value, entry.actual, entry.param
190
-
143
+ entry.actual = Tweek.net_param(netdev, entry.param)
191
144
  rescue
192
145
  cs.error "#{entry.lineno}: Network parameter #{entry.param} not handled: #{$!.message}"
193
146
  next
194
147
  end
195
148
  end
149
+
150
+ cs.assert_equal entry.value, entry.actual, entry.param
196
151
  cs.generate :entry, entry
197
152
  end
198
153
  end
199
154
 
200
155
  when 'EXT4' # EXT4 filesystems info via `dumpe2fs -h /dev/#{device}`
201
- mounted = File.open("/proc/mounts", &:readlines).map{|m| m.split(' ')}
156
+ mounted = Tweek.mounted
202
157
  mounts = Dir.glob(self.list.split(' '))
203
158
  mounts.each do |mount|
204
159
  unless this = mounted.select{|m| (mount == m[0] or mount == m[1]) and m[2] == 'ext4'}.first
@@ -223,8 +178,8 @@ class Tweek::Section < Array
223
178
  cs.warn "#{self.lineno}: XFS device check skipped: no mountpoints found"
224
179
  end
225
180
  mounts.each do |mount|
226
- xfsinfo = `xfs_info #{mount} 2>/dev/null`.chomp
227
- if $?.exitstatus > 0
181
+ xfsinfo = Tweek.xfsinfo(mount)
182
+ unless xfsinfo
228
183
  cs.warn "No XFS filesystem at #{mount}"
229
184
  each_entry (cs) { |entry| cs.generate :entry, entry }
230
185
  next
@@ -248,5 +203,89 @@ class Tweek::Section < Array
248
203
  end
249
204
 
250
205
  end
206
+
207
+ def handle_irqs netdev, cs, entry
208
+ irqs = Tweek.irqs(netdev)
209
+
210
+ if irqs.empty?
211
+ cs.warn "#{netdev} IRQ check skipped: none found"
212
+ entry.actual = 'null'
213
+ cs.generate :entry, entry
214
+ return
215
+ end
216
+
217
+ ncores = Tweek.ncores
218
+ mismatches = 0
219
+ expected_rps = []
220
+ expected_rss = []
221
+ irqs.each_with_index do |irq, ix|
222
+ case entry.value
223
+ when 'null','none','ignore'
224
+ next
225
+
226
+ when 'aws'
227
+ case ncores
228
+ when 8..64
229
+ expected_rps << ("00000000," * 3) + "0000ff00"
230
+ expected_rss << ("00000000," * 3) + sprintf("%08x", 1<<ix)
231
+ when 1..8
232
+ expected_rps << "0000"
233
+ expected_rss << sprintf("%04x", 1<<ix)
234
+ else
235
+ cs.warn "#{netdev} IRQ strategy '#{entry.value}' can't handle #{ncores} cores"
236
+ return
237
+ end
238
+
239
+ when 'pin'
240
+ case ncores
241
+ when 1..8 # not a lot of choice
242
+ expected_rps << "0000"
243
+ expected_rss << "0001"
244
+
245
+ when 8..32 # RPS on cores 10-15 and 18-31, RSS tied to 0-7
246
+ case ix
247
+ when 0..7
248
+ expected_rps << ("00000000," * 3) + "fffefe00"
249
+ expected_rss << ("00000000," * 3) + sprintf("%08x", 1<<(ix+1))
250
+ else
251
+ cs.warn "#{netdev} IRQ strategy '#{entry.value}' can't handle IRQ#{ix}"
252
+ return
253
+ end
254
+
255
+ when 32..64 # Split the work across the two nodes
256
+ case ix
257
+ when 0..3 # alloc on node 0 (cpus 0-3)
258
+ expected_rps << ("00000000," * 2) + "0000ffff," + "0000ffe0"
259
+ expected_rss << ("00000000," * 3) + sprintf("%08x", 1<<(ix+1))
260
+ when 4..7 # alloc on node 1 (
261
+ expected_rps << ("00000000," * 2) + "ffff0000," + "ffe00000"
262
+ expected_rss << ("00000000," * 3) + sprintf("%08x", 1<<(ix + 9))
263
+ else
264
+ cs.warn "#{netdev} IRQ strategy '#{entry.value}' can't handle IRQ#{ix}"
265
+ return
266
+ end
267
+
268
+ else
269
+ cs.error "#{entry.lineno}: Can't handle #{ncores} cores in IRQ strategy '#{entry.value}'"
270
+ return
271
+ end
272
+
273
+ else
274
+ cs.error "#{entry.lineno}: Unrecognized #{netdev} IRQ strategy '#{entry.value}'"
275
+ return
276
+ end
277
+ end
278
+ irqs.each_with_index do |irq, ix|
279
+ actual_rss = Tweek.net_rss(irq)
280
+ mismatches += cs.assert_equal expected_rss[ix], actual_rss, "#{netdev}_irq_#{irq}_rss"
281
+ end
282
+ irqs.each_with_index do |irq, ix|
283
+ actual_rps = Tweek.net_rps(netdev, ix)
284
+ mismatches += cs.assert_equal expected_rps[ix], actual_rps, "#{netdev}_irq_#{irq}_rps"
285
+ end
286
+ entry.actual = 'null' if mismatches > 0
287
+ return
288
+ end
289
+
251
290
  end
252
291
 
data/lib/tweek/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tweek
2
- VERSION = "0.9.9"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/tweek.rb CHANGED
@@ -1,3 +1,64 @@
1
+ # Define data-collection methods so we can easily stub them for tests
2
+ #
1
3
  module Tweek
2
- # nothing yet
4
+
5
+ def self.bootline
6
+ @bootline ||= ::File.open("/proc/cmdline", &:read).chomp
7
+ end
8
+
9
+ def self.balance_pid
10
+ @balance_pid ||= `pgrep irqbalance`.chomp.to_i
11
+ end
12
+
13
+ # Determine the queue processing interrupts for the network device
14
+ # Empirically we observe that the convention for the name in /proc/interrupts varies
15
+ # so some hacking required...
16
+ def self.irqs netdev
17
+ @irqs = ::File.open("/proc/interrupts", &:readlines).grep(/\b#{netdev}\b/)
18
+ @irqs.reject! {|i| i !~ /\b#{netdev}-Tx-?Rx/} if @irqs.size > 1
19
+ @irqs.map{|m| m.partition(':')[0].strip}
20
+ end
21
+
22
+ def self.ncores
23
+ `getconf _NPROCESSORS_ONLN`.chomp.to_i rescue 0
24
+ end
25
+
26
+ def self.clocksource param
27
+ ::File.open("/sys/devices/system/clocksource/#{param}/current_clocksource",&:read).chomp rescue $!.message
28
+ end
29
+
30
+ def self.sysctl name
31
+ ::File.open("/proc/sys/#{name}", &:read).chomp.gsub(/\s+/,' ') rescue $!.message
32
+ end
33
+
34
+ def self.net_driver name
35
+ ::File.basename(::File.readlink("/sys/class/net/#{name}/device/driver"))
36
+ end
37
+
38
+ def self.blk_param blkdev, name
39
+ ::File.open("/sys/block/#{blkdev}/queue/#{name}", &:read).chomp rescue $!.message
40
+ end
41
+
42
+ # Receive Side Scaling - hardware
43
+ def self.net_rss irq
44
+ ::File.open("/proc/irq/#{irq}/smp_affinity",&:read).chomp rescue $!.message
45
+ end
46
+
47
+ # Receive Packet Steering - software
48
+ def self.net_rps netdev, ix
49
+ ::File.open("/sys/class/net/#{netdev}/queues/rx-#{ix}/rps_cpus", &:read).chomp rescue $!.message
50
+ end
51
+
52
+ def self.net_param netdev, name
53
+ ::File.open("/sys/class/net/#{netdev}/#{name}", &:read).chomp.gsub(/\s+/,' ')
54
+ end
55
+
56
+ def self.mounted
57
+ ::File.open("/proc/mounts", &:readlines).map{|m| m.split(' ')}
58
+ end
59
+
60
+ def self.xfsinfo mount
61
+ info = `xfs_info #{mount} 2>/dev/null`.chomp
62
+ return $?.exitstatus > 0 ? nil : info
63
+ end
3
64
  end
data/settings/sample.set CHANGED
@@ -1,7 +1,13 @@
1
- # A documentation-rich sample for the parameter checking script
1
+ # A documentation-rich sample file for Tweek
2
+ #
3
+ # This is NOT meant to be a recommended parameter set, it's purpose
4
+ # is to document the format with real examples and educate on the meaning and effect of
5
+ # various tuning parameters. Use with caution, YMMV!
2
6
  #
3
7
  # Comments begin with # and extend to the end of the line
4
- # Block comments are Ruby style =begin and =end
8
+ =begin
9
+ Block comments are Ruby style =begin and =end
10
+ =end
5
11
  # Conditionals use 'k' for kernel version, 'v' for distro version and 'd' for distro
6
12
  # Version conditionals use the http://guides.rubygems.org/patterns/#semantic-versioning
7
13
  # Distro conditionals follow Ruby syntax and you may use string or regex comparisons
@@ -25,12 +31,16 @@ maxcpus = 63 # Set the number of physical cores, eliminates the 'B' hyperthreads
25
31
  # intel_idle.max_cstate=1
26
32
  numa = off if k>3.9 # won't move memory around between NUMA zones, useful with large working set
27
33
 
34
+
35
+ # Recommended for heavy networking activity
36
+ #
28
37
  SYSCTL
29
38
  vm.min_free_kbytes = 838608
30
- vm.zone_reclaim = 1 if k~>4.9.0,d=='Ubuntu'
31
- vm.zone_reclaim_mode = 1 if k~>3.13.0, k<4.9.0
39
+ vm.zone_reclaim_mode = 1
32
40
 
33
41
  # These parameters taken from Brendan Gregg's Re:Invent talk 2014
42
+ #
43
+ SYSCTL
34
44
  net.core.somaxconn = 1000
35
45
  net.core.netdev_max_backlog = 5000
36
46
  net.core.rmem_max = 16777216
@@ -47,27 +57,21 @@ net.ipv4.tcp_slow_start_after_idle = 0
47
57
  net.ipv4.tcp_tw_reuse = 1
48
58
  net.ipv4.ip_local_port_range = 1024 65535
49
59
  net.ipv4.tcp_abort_on_overflow = 1 # allows a connection that is queued to be reset, not just dropped.
50
- net.ipv4.tcp_fin_timeout = 50 if d=~/Amazon|RedHat/i
60
+ net.ipv4.tcp_fin_timeout = 50 if d=~/AmazonAMI|RedHat/i
51
61
 
62
+ # Page cache flushing optimization (Brendan Gregg, Re:Invent 2014)
52
63
  # Smoother page cache flushing: background flush earlier, aggressive later
53
- # Brendan Gregg, Re:Invent 2014
54
64
  #
55
65
  vm.dirty_ratio = 80
56
66
  vm.dirty_background_ratio = 5
57
67
  vm.dirty_expire_centisecs = 12000
58
68
 
59
- =begin
60
- # These are all the recommended RedHat TCP settings
61
- # not yet validated, so used as demo of multiline comments
62
- net.ipv4.tcp_syn_retries = 0
63
- net.ipv4.tcp_synack_retries = 0
64
- net.ipv4.tcp_timestamps = 0
65
- =end
66
-
67
- NET eth0 # Define one or more network devices
68
- # Check the IRQ strategy:
69
+ NET eth0
70
+ # Check the IRQ strategy using the 'irqs' parameter:
71
+ #
69
72
  # aws: Use first numa node, split RSS from RPS
70
73
  # RSS allocated across 0-7 (node 0), RPS on first numa node
74
+ #
71
75
  # pin: Differs depending on number of cores
72
76
  # 32 Apportion across the single node as follows:
73
77
  # RPS allocated across cores 10-15 and 18-31
@@ -75,10 +79,14 @@ NET eth0 # Define one or more network devices
75
79
  # 64 Use both NUMA nodes, leave first core free on each node
76
80
  # RPS allocated across remaining cores on each node
77
81
  # RSS allocated across 1-4 (node 0) then 17-20 (node 1)
78
- # null: Ignore this adapter
79
- irqs = pin
82
+ #
83
+ # balance: Use the irqbalance daemon
84
+ # null: Ignore this device
85
+ #
86
+ irqs = aws
87
+ # Use the 'driver' parameter for the driver name
80
88
  driver = ena
81
- # Check values in /sys/class/net/<device>/ tree
89
+ # Other parameter names match values in /sys/class/net/<device>/ tree
82
90
  mtu = 9001
83
91
  device/driver/module/version = 1.1.3
84
92
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tweek
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.9
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Townsend
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-20 00:00:00.000000000 Z
11
+ date: 2017-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -65,7 +65,7 @@ files:
65
65
  - README.md
66
66
  - bin/tweek
67
67
  - lib/tweek.rb
68
- - lib/tweek/app.rb
68
+ - lib/tweek/file.rb
69
69
  - lib/tweek/section.rb
70
70
  - lib/tweek/version.rb
71
71
  - settings/sample.set