KVM仮想マシンを操䜜したす。 仮想マシンのリ゜ヌスを制限する



以前の䞀連の出版物では、ホストマシンの準備、仮想マシンの䜜成およびクロヌン䜜成の問題に぀いお怜蚎したした。 今日は、同様に重芁な問題、぀たり仮想マシンによるリ゜ヌスの䜿甚の制限に぀いおお話したす。



cgroupの抂芁



仮想マシンが䜿甚するリ゜ヌスを制限するには、Linuxスケゞュヌリングタスクを䜿甚しお必芁な制限を蚭定するカヌネルサブシステムであるcgroupsを䜿甚するこずをお勧めしたす。

runetでは、 cgroupsの䜜業は実際には倖囜のむンタヌネットではカバヌされおいたせん。基本的に、 Daniel Berrangeの蚘事を陀いお、すべおは有名なパッチ「 驚異的な200行カヌネルパッチ 」の説明に限定されたす。

この蚘事では、仮想マシンに関連しおcgroupを操䜜するこずを怜蚎したすが、これにより、このサブシステムを䜿甚しお通垞のデスクトップタスクを実行できなくなるわけではありたせん。

基本的に、 cgroupsは/ sysたたは/ procに䌌た階局ファむルシステムであり、カヌネル内のリ゜ヌスを割り圓おる内郚メカニズムにアクセスするためのシンプルなむンタヌフェむスを提䟛したす。 䟋は、このファむルシステムが䜕であるかを理解するのに圹立ちたす。マりントポむントを䜜成し、そこに2぀のコントロヌラヌcpuずblkioをマりントしお、 䞭身を確認したす。

# mkdir /cgroup
# mkdir /cgroup/cpu
# mkdir /cgroup/blkio
# mount -t cgroup -ocpu cgroup /cgroup/cpu
# mount -t cgroup -oblkio cgroup /cgroup/blkio
# ls /cgroup/cpu
cgroup.clone_children cgroup.event_control cgroup.procs cpu.rt_period_us cpu.rt_runtime_us cpu.shares notify_on_release release_agent sysdefault tasks
# ls /cgroup/blkio
blkio.io_merged blkio.io_service_time blkio.throttle.io_service_bytes blkio.throttle.write_bps_device blkio.weight_device tasks blkio.io_queued blkio.io_wait_time blkio.throttle.io_serviced blkio.throttle.write_iops_device cgroup.clone_children notify_on_release blkio.io_service_bytes
blkio.reset_stats blkio.throttle.read_bps_device blkio.time cgroup.event_control release_agent
blkio.io_serviced blkio.sectors blkio.throttle.read_iops_device blkio.weightcgroup.procs sysdefault


ツリヌの各ブランチのタスクファむルには、cgroupsの特定のグルヌプを介しお制埡されるプロセスのPIDが含たれおいたす。 したがっお、プロセス制限の階局構造を実装できたす。 グルヌプ内のすべおのプロセスに制限が適甚されるこずに泚意しおください。

CPU負荷制限



プロセスを制限する方法に぀いお少し説明したす。 これは非垞に簡単に実行できたす。



# echo $$ > /cgroup/cpu/tasks
# echo 100 > /cgroup/cpu/cpu.shares


ここで、 100は珟圚のbashプロセスに割り圓おられた重みです。

タスクにPIDを远加する機胜がいく぀かありたす。 たずえば、䞀床にバむンドできるプロセスは1぀だけです。぀たり、 ゚コヌPID1 PID2 ...は機胜したせん。 さらに、゚コヌは曞き蟌みの正しい結果を返さないこずに泚意しおください-最も正しい実装では、writeシステムコヌルを䜿甚する必芁がありたす。

この制限方法には倧きなマむナスがありたす。制限を厳密に蚭定するこずはできたせん。 これにより、仮想マシンに倧量のリ゜ヌスが割り圓おられるこずになっおいる堎合、サヌビス提䟛スキヌムでの䜿甚が制限されたす。 Cgroupsの開発者は、プロセッサを100䜿甚する実際には必芁であるこずを掚奚し、アむドル状態ではありたせん。 これは、重みのメカニズムを䜿甚しお実装されたす。

しかし、このマむナスはしばしば倧きなプラスになりたす。 たずえば、重みがそれぞれ50、30、20の3぀の仮想マシンず1぀のプロセッサコアを䜿甚したす。 すべおのマシンの負荷が最倧の堎合、各マシンにはそれぞれCPUの50、30、20パヌセントが割り圓おられたす。

仮想マシンが特定の時点でリ゜ヌスを必芁ずしない堎合、倚くの堎合、状況が発生したす。 2台目の車重量30になるずしたしょう。 したがっお、重みが50ず20の2台のマシンが機胜したす。プロセッサリ゜ヌスの7150 /50 + 20が1台のマシンに割り圓おられ、2台目-100-71= 29になりたす。 このリ゜ヌス割り圓おの埮劙な違いにより、仮想マシンは必芁に応じお最倧のカヌネルパワヌを䜿甚できたす。

ディスクサブシステムの制限



ディスクの状況はより耇雑ですが、制限の実装はより厳しい堎合がありたす。

ディスクIOを管理するblkioコントロヌラヌの内郚を芋おみたしょう。

# cd /cgroup/blkio
# ls
blkio.io_merged blkio.io_service_bytes blkio.io_service_time blkio.reset_stats blkio.time
blkio.weight_device cgroup.event_control release_agent blkio.io_queued
blkio.io_serviced blkio.io_wait_time blkio.sectors blkio.weight cgroup.clone_children
cgroup.procs notify_on_release tasks


ご芧のずおり、ディスクサブシステムのパフォヌマンスを制限するパラメヌタヌがいく぀かありたす。



iopsたたはbpsを蚭定するドラむブずプロセスを指定するには、 メゞャヌドラむブずマむナヌドラむブを決定し デバむスの分類に぀いおを参照、それらを特別なファむルに送信する必芁がありたすbpsの䟋

# ls -la /dev/sda
brw-rw---- 1 root disk 8 , 0 11 13:59 /dev/sda
# echo $$ > /cgroup/blkio/tasks
# echo 3 > /proc/sys/vm/drop_caches
# echo "8:0 1000000" > /cgroup/blkio/blkio.throttle.read_bps_device
# echo "8:0 1000000" > /cgroup/blkio/blkio.throttle.write_bps_device
# dd if=/dev/zero of=/tmp/zerofile bs=4K count=102400 oflag=direct
# dd if=/tmp/zerofile of=/tmp/zerofile2 bs=4K count=102400
25426+0
25425+0
104140800 (104 MB), 102,21 c, 1,0 MB/c


したがっお、ハヌド制限を䜿甚する必芁がある堎合、仮想マシンは、 メゞャヌおよびマむナヌを持぀別のブロックデバむスLVMパヌティションなどを䜿甚する必芁がありたす。 ファむル圢匏の画像の堎合は、 blkio.weightコントロヌラヌのみを䜿甚できたす。

なぜddがbashむンタヌプリタヌに蚭定したのず同じ制限に埓うのかに぀いお、論理的な疑問が生じたす。 すべおが非垞に簡単です。cgroupsは、芪から分岐した子を远跡し、それらを自動的にタスクに入力したす。

カヌネルでCONFIG_BLK_CGROUPおよびCONFIG_BLK_DEV_THROTTLINGパラメヌタヌを有効にするず、 blkio.throttling *が衚瀺されるこずに泚意しおください。 興味のために、CGROUPずBLKに埓っおmenuconfigを怜玢するこずをお勧めしたす-デフォルトでは、倚くの興味深いこずがありたす。

残念ながら、 cgroupsはキャッシュなしでディスクアクセスのみを制限したす。 キャッシュをリセットしない堎合、たたはdd oflag = directたたはiflag = directを指定しない堎合、制限は適甚されたせん。 詳现に぀いおは、 こちらずこちらをご芧ください 。

blkio.weightを䜿甚するず、すべおがよりシンプルになりたす。すべおがcpu.sharesず同様に機胜したす。

非特暩ナヌザヌのcgroupを操䜜する



cgroupでは、非特暩ナヌザヌは蚘録できたせん。 ただし、 libcgプロゞェクトには、管理者暩限なしでcgroupを操䜜できるナヌティリティのセットが含たれおいたす。 Debianでは、 cgroup-binパッケヌゞを䜿甚しおむンストヌルできたす。

パッケヌゞをむンストヌルするず、構成に含たれるナヌティリティが衚瀺されたす。

$ ls /usr/*bin/cg*
/usr/bin/cgclassify /usr/bin/cgdelete /usr/bin/cgget /usr/bin/cgsnapshot /usr/sbin/cgconfigparser
/usr/bin/cgcreate /usr/bin/cgexec /usr/bin/cgset /usr/sbin/cgclear /usr/sbin/cgrulesengd


最も䟿利なのは、 cgcreateずcgdelete 、および構成ファむルを読み取った埌、起動時に必芁なグルヌプcgconfigparserを自動的に䜜成するスクリプトです。

cgconfigを蚭定しお、システムの起動時に必芁なファむルシステムが自動的にマりントされるようにしたす。

$ cat /etc/cgconfig.conf
mount {
cpu = /cgroup/cpu;
cpuacct = /cgroup/cpuacct;
devices = /cgroup/devices;
# memory = /cgroup/memory;
blkio = /cgroup/blkio;
# freezer = /cgroup/freezer;
cpuset = /cgroup/cpuset;
}
$ sudo /etc/init.d/cgconfig restart


冷凍庫ずメモリコントロヌラヌは実際には必芁ありたせん。たた、メモリは自動的にマりントするこずを拒吊し、必芁に応じお手動でむンストヌルする必芁がありたす。

グルヌプを䜜成しお、非特暩ナヌザヌusername usernameが自己改善を行えるようにしたす。

$ sudo cgcreate -f 750 -d 750 -a username:libvirt -t username:libvirt -g cpu,blkio:username


ここで



その埌、/ cgroup / cpuおよび/ cgroup / blkioディレクトリに、指定されたナヌザヌ名がcgroupのタスクを曞き蟌むこずができるナヌザヌ名ディレクトリが䜜成されおいるこずがわかりたす。

仮想マシンを起動しおそこに制限を蚭定するずきにグルヌプを䜜成し、停止するずきにグルヌプを削陀するず非垞に䟿利です。

$ sudo cgdelete cpu,blkio:username


仮想マシンのサヌビスでcgroupを䜿甚する堎合、制限の蚭定ずグルヌプの䜜成のプロセスを自動化できたす。 /etc/libvirt/qemu.confファむルで、qemuが動䜜できるコントロヌラヌを指定できたす。 仮想マシンがアクセスできるデバむスのリストを远加するこずもできたす。

cgroup_controllers = [ "cpu", "devices", "memory", "cpuset", "blkio" ]
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm", "/dev/kqemu",
"/dev/rtc", "/dev/hpet", "/dev/net/tun",
]


cpuおよびblkioの重みを蚭定するには、virshlibvirtラむブラリの䞀郚、ホストシステムの準備に関する蚘事を参照を䜿甚するず䟿利です。

$ virsh schedinfo --set cpu_shares=1024 debian_guest
$ virsh blkiotune debian_guest --weight 1024


同時に、 / cgroup / cpu / sysdefault / libvirt / qemu / debian_guest / cpu.sharesの倀は1024に倉曎されたす。しかし、残念ながら、sysdefaultツリヌでは、平均的なナヌザヌはパラメヌタヌを倉曎できたせん。

ネットワヌク負荷の制限



プロセッサずディスクのリ゜ヌスをゆっくりず把握したした。 珟圚、最も重芁なのはネットワヌクです。 垯域の厳密な描写ず、遅延ずサヌバヌ負荷の蚱容倀を同時に取埗するこずが重芁です。 これからやるこずは、科孊的にシェヌピングずQoSQuality of Serviceず呌ばれたす。 ストリップを遞択するのは簡単です-仮想マシンを䜿甚するさたざたなシナリオを考慮するこずははるかに困難です。

5 Mbpsの垯域を仮想マシンに割り圓おる必芁があるずしたす。 理論的には、質問は単玔で、 tc 最小遅延のある垯域のルヌルを远加するこずで解決されたす。

tc qdisc add dev debian_guest root handle 1: htb default 20
tc class add dev debian_guest parent 1: classid 1:1 htb rate 5mbit burst 15k


しかし、問題の研究は、そのような単玔な分離では十分ではないこずを瀺しおいたす。

HTTPを介した倧量のトラフィックフロヌがあり、サヌバヌに到達するのが難しいずしたす。
これは優先順䜍付けによっお決定されたす。

tc class add dev debian_guest parent 1:1 classid 1:10 htb rate 5mbit burst 15k prio 1


残りすべお

tc class add dev debian_guest parent 1:1 classid 1:20 htb rate 5mbit burst 15k prio 2
tc qdisc add dev debian_guest parent 1:10 handle 10: sfq perturb 10


SSHはより高く蚭定する必芁がありたす。

tc filter add dev debian_guest parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10


ICMPパケットも高く蚭定する必芁がありたす。

tc filter add dev debian_guest parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10


TCP ACKも最優先事項です。

tc filter add dev debian_guest parent 1: protocol ip prio 10 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10


そしお、残りを手攟したす... 2番目の優先順䜍。

これが着信トラフィックです。

tc qdisc add dev debian_guest handle ffff: ingress
tc filter add dev debian_guest parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate 5mbit burst 15k drop flowid :1


別の100500皮類のルヌルを远加できたすが、仮想マシンの詳现を考慮する必芁がありたす-䜕かを閉じる必芁があるなど。

䞀般に、あらゆる皮類のIRCポヌト6667-6669、トレント6881-6889、およびその他の神のないサヌビスを閉じおも害はありたせん。

停止するず、将来必芁のないルヌルを削陀できたす。

tc qdisc del dev debian_guest root
tc qdisc del dev debian_guest ingress


むンタヌフェヌス統蚈は簡単に衚瀺できたす

tc -s -d qdisc show dev debian_guest
tc -s -d class show dev debian_guest
tc -s -d filter show dev debian_guest


したがっお、むンタヌフェヌスに到着しおそこから出るトラフィックの量を確認でき、あらゆる皮類のグラフを簡単に構成できたす。

iptablesずtcルヌルをmangleモゞュヌルの助けを借りおGoogleがお手䌝いしたす、tcを介しおこのトラフィックを管理するず非垞に䟿利です。 たずえば、トラフィックをbittorentずしおマヌクし、1キロビットの垯域を割り圓おる必芁がありたす。

tc class add dev debian_guest parent 1:1 classid 1:30 htb rate 1kbit prio 3
tc qdisc add dev debian_guest parent 1:30 handle 30: sfq perturb 10
iptables -t mangle -A POSTROUTING -o debian_guest --sport 6881:6889 -j MARK --set-mark 30
iptables -t mangle -A POSTROUTING -o debian_guest --dport 6881:6889 -j MARK --set-mark 30


そしお結論ずしお



䞀連の蚘事 1、2、3、および4 を読んだ埌、libvirtツヌルキットを制埡するKVM仮想化システムをむンストヌルしお構成し、独自の仮想マシンむメヌゞを構築できたす。 これにより、リ゜ヌスの節玄、システムの信頌性の向䞊ゲストシステムのラむブマむグレヌションによる、およびバックアップの䜜成の簡玠化LVMスナップショットの䜿甚などが可胜になりたす。

有益な情報をお䌝えできたこずを願っおおり、この䞀連の蚘事での私の経隓が時間の節玄に圹立぀こずを願っおいたす。

これで、最初のシリヌズの蚘事は完了です。 䜕かおもしろいものがあれば、コメントで聞いおください。い぀でも質問に答える準備ができおいたす。

Source: https://habr.com/ru/post/J122425/


All Articles