lsof | grep 'DEL.lib'
lsof | grep 'DEL.lib' | sort -k1,1 -u
pour la libc : lsof | grep 'DEL'|grep libc-2.13.so|sort -k1,1 -u
Problème assez simple : lorsque je télécharge des vidéos de vacances sur mon serveur, la connexion est saturée et je ne peux plus rien faire sans latence (ssh, web, jeux..)
Pour résoudre ce problème, j'ai limité l'upload de mon serveur de façon basique le temps de mieux comprendre tc (et sa partie classful) :
tc qdisc add dev eth0 root tbf rate 6000kbit latency 50ms burst 10000
Et ça marche bien :-) Je limite l'upload à 6000kbit/s soit la moitié de
Sans cette politique je dl à 12Mbit/s depuis chez moi soit environ 1,5MBytes/s (1,5Moctets/s)
Une fois la qdisc appliquée je chute de moitié. Un peu violent, mais au moins personne n'est pénalisé lorsque quelqu'un télécharge ^^ Je vais tenter d'augmenter un peu cette limite pour voir jusqu'où je peux aller.
Ce n'est cependant pas parfait, ce workaround ne fonctionne que lorsqu'on télécharge sur mon serveur, il faudrait avoir un routeur à la maison (ex : raspberry) et le faire dessus avec des qdisc classful pour limiter suivant le type de flux
PS :
Pour voir et supprimer cette politique :
tc qdisc show dev eth0
tc qdisc del dev eth0 root
Choix de la valeur de 'burst' :
C'est la taille en bytes du bucket. Elle doit être un minimum de : rate/HZ. Pour trouver son HZ :
uname -r
CONFIG_HZ_250=y
Donc pour un rate de 6000kbit/sec = 6 000 000 bit/sec, on a :
burst_mini = 6 000 000 / 250 = 24000 bits = 3000 bytes
Et pour le burst maximum, on prend le rate max du server : 100Mbps = 100 000 000 bit
burst_max = 100 000 000 / 250 = 400 000 bits = 50 000 bytes
Il faut choisir une valeur dans cet intervalle, c'est la "réserve" qui sera disponible quand on commencera un téléchargement.
50 000bytes, ça fait 50Mo, donc les 50 premiers Mo du téléchargement ne seront pas limités ce qui fait un peu trop.
errs = []
def test_server(errs, server)
lambda do |options|
begin
server =~ /(.+)@(.+)/
server_name, user = $2, $1
puts server_name
s = Net::SSH.start(server_name, user)
s.close
s = server
rescue Errno::EHOSTUNREACH, SocketError
puts "echec connexion #{server} : #{$!}"
errs << server
s = nil
end
return s
end
end
Net::SSH::Multi.start(:on_error => :warn) do |session|
session.use &test_server(errs, 'root@srv-04')
session.use &test_server(errs, 'root@srv-07')
session.use &test_server(errs, 'root@srv-08')
session.use &test_server(errs, 'root@fail-08.local')
session.exec( "hostname" )
session.loop
end
unless errs.empty?
puts "The command failed on #{errs.size} hosts"
end
Sympa l'auto completion de ce shell
Ce tuto est bien fait
Mais j'ai un peu de mal avec awk : pour des tâches simple je m'en sors avec cut, et pour des tâches plus complexes je passe à un vrai langage de scripting comme python