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-hakai
estã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.erb
de httpd.conf
se torna o mostrado:
<IfModule prefork.c>
StartServers 8
MinSpareServers 10
MaxSpareServers 20
ServerLimit 255
MaxClients 255
MaxRequestsPerChild 1000
</IfModule>
Se MaxClients
for 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 MaxClients
o www-1.example
servidor.
{
"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 gargor
fazendo 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-hakai
evaluate
# 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.
gargor
executa 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 mutation
está 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.