Servidores de internet de ajuste automático por algoritmo genético

Você pode obter boas configurações durante o sono;)

Em primeiro lugar, é necessário preparar-se até o ponto em que um teste de estresse comum seja possível. Prepare o servidor a ser usado para atacar em um local próximo (em termos de rede) do alvo. Especificações adequadas também são necessárias para o atacante.

Qualquer coisa é aceitável como ferramenta de estresse, desde que possa ser usada a partir de uma linha de comando. Embora ab(Apache Bench)etc. tenham sido incluídos desde o início e, portanto, seriam simples, desta vez, um software chamado green-hakai foi usado. (As instruções de instalação green-hakaiestão disponíveis no site do produto)

Ao realizar o ajuste automático, o destino (= grupo de servidores do destino de ajuste) é controlado pelo Chef e é necessário que os parâmetros se tornem atributos do Chef. Por exemplo, quando o modelo httpd.conf.erbde httpd.confse torna o mostrado:

<IfModule prefork.c>
StartServers 8

MinSpareServers 10

MaxSpareServers 20

ServerLimit 255

MaxClients 255

MaxRequestsPerChild 1000

</IfModule>

Se MaxClientsfor para ser atributo do Chef, faça o seguinte:

<IfModule prefork.c>
StartServers 8

MinSpareServers 10

MaxSpareServers 20

ServerLimit 255

MaxClients
<%= node["httpd"]["max_clients"] %>
MaxRequestsPerChild 1000

</IfModule>

Quando neste estado, escrevendo conforme mostrado abaixo em nodes/www-1.example.json, é possível controlar MaxClientso www-1.exampleservidor.

{
"httpd" :{
"max_clients" :255
},
...
}

Como resultado de reescrever este JSON, implantando-o no destino usando Chef e, em seguida, aplicando o teste de estresse, será gargor(o novo software) que pesquisará o novo parâmetro de teste usando GA.

Instale gargorfazendo o seguinte: (Ruby 1.9.3 ou superior é necessário)

$ [sudo] gem install gargor

Posicione no repositório Chef. Reescreva o conteúdo conforme necessário.gargor.rb

# generations: set > 1
max_generations
10

# individuals number of some generation.
population
10

# elite number of some generation.(carried over)
elite
1

# Probability of mutation set "0.01" to "1%" (when crossover)
mutation
0.01

# target cook command : '%s' will replace by node name.
target_cooking_cmd
"knife solo cook %s"

# target nodes
# performing target_cooking_command before the attack.
target_nodes
["www-1.example","www-2.example","db-1.example"]

# attack command
attack_cmd
"ssh attacker.example ./bin/ghakai www-1.example.yml 2>/dev/null"


# evalute of the attack
# code: exit code of attack_cmd command (0 => succees)
# out: standard output of attack_cmd command
# time: execute time of attack_cmd
evaluate
do |code,out,time|
puts out

fitness
= 0
# get "FAILED" count from stadard output of stress-tool,
# and set fitess to 0 when FAILED > 0.
if time > 0 && code == 0 && /^FAILED (d+)/ =~ out && $1 == "0"
# get fitness from stadard output of stress-tool.
# e.g.: request count:200, concurrenry:20, 45.060816 req/s
if /, ([.d]+) req/s/ =~ out
fitness
= $1.to_f
end
# To get fitness simply,to use execution time
# fitness = 1/time
end
# This block must return the fitness.(integer or float)
fitness

end

# definition of parameters(GA)
#
# param _name_ do
# json_file: Chef parameter(JSON) file (such as nodes/*.json or roles/*.json)
# (Warning!) gargor will overwrite their json files.
# json_path: to locate the value by JSONPath
# mutaion: to set value when mutaion
param
"max_clients" do
json_file
"roles/www.json"
json_path
'$.httpd.max_clients'
mutation rand
(500)+10
end

param
"innodb_log_file_size" do
json_file
"nodes/db-1.example.json"
json_path
'$.mysqld.innodb_log_file_size'
mutation rand
(200)
end

param
"sort_buffer_size" do
json_file
"nodes/db-1.example.json"
json_path
'$.mysqld.sort_buffer_size'
mutation rand
(1000)
end

param
"read_buffer_size" do
json_file
"nodes/db-1.example.json"
json_path
'$.mysqld.read_buffer_size'
mutation rand
(1000)
end

param
"query_cache_size" do
json_file
"nodes/db-1.example.json"
json_path
'$.mysqld.query_cache_size'
mutation rand
(100)
end

Ao usar algo diferente , será necessário customizar o bloco.green-hakaievaluate

# fitness = 1/time

No entanto, ao remover o comentário desta parte, é possível decidir uma pontuação aproximada pelo (número inverso do) tempo de medição.

gargorexecuta o teste de estresse para o número de (número de gerações * número de indivíduos) no máximo e pesquisa os parâmetros que parecem bons. Como leva muito tempo, provavelmente é melhor correr ao terminar o trabalho do dia para confirmar os resultados na manhã seguinte.

Obviamente, é possível realizar várias configurações de parâmetros.

Como o GA é usado, existem elementos erráticos e, a menos que o software seja testado, não se sabe se bons resultados serão produzidos. Se o número de indivíduos e o número de gerações forem aumentados, demorará mais, mas a precisão será melhorada. Além disso, como a precisão também muda dependendo de como mutationestá escrito, o usuário é encorajado a tentar várias coisas.

Como gargoré apenas um software recém-criado, relate bugs e correções para github. O desenvolvedor está aguardando uma solicitação de pull.

https://github.com/tumf/gargor