centos 7 cpuバインド+I/Oスケジューリングアルゴリズムチューニング

6920 ワード

centos 7 cpuバインド+I/Oスケジューリングアルゴリズムチューニング
一、cpuバインド(CPU Affinity)1、属性はCPU Affinityとは何ですか?Affinityは、プロセススケジューラがこのプロセスをどのCPUにスケジューリングできるかを示すプロセスの属性です.Linuxでは,CPU affinityを利用して1つ以上のプロセスを1つ以上のCPUにバインドすることができ,CPU Affinityは2つに分けられ,softaffinityとhardaffinityである.ソフトウェアfinityは1つの提案にすぎません.避けられない場合は、スケジューラはプロセスを他のCPUにスケジューリングします.hardaffinityはスケジューラが守らなければならないルールです.
      CPU    :
1):  CPU   
	CPU         ,          CPU     ,       CPU cache  。        CPU   ,          。
2)  CPU      
	                  ,                ,      CPU      。              。          ,       。
3)  time-sensitive
	   real-time time-sensitive   ,              CPU ,           CPU 。      ,        CPU ,              CPU 。

2、例
[root@compute ~]# ps -e |grep kvm       //        kvm    
  953 ?        00:00:00 kvm-irqfd-clean
 6852 ?        00:01:55 qemu-kvm
 6859 ?        00:00:00 kvm-pit/6852
 7820 ?        00:00:53 qemu-kvm
 7827 ?        00:00:00 kvm-pit/7820
18943 ?        00:44:56 qemu-kvm
18953 ?        00:00:00 kvm-pit/18943

[root@compute ~]# taskset -h         //     taskset     

Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]

Options:
 -a, --all-tasks         operate on all the tasks (threads) for a given pid
 -p, --pid               operate on existing given pid
 -c, --cpu-list          display and specify cpus in list format
 -h, --help              display this help
 -V, --version           output version information

The default behavior is to run a new command:
    taskset 03 sshd -b 1024
You can retrieve the mask of an existing task:
    taskset -p 700
Or set it:
    taskset -p 03 700
List format uses a comma-separated list instead of a mask:
    taskset -pc 0,3,7-11 700
Ranges in list format can take a stride argument:
    e.g. 0-31:2 is equivalent to mask 0x55555555

For more information see taskset(1).

[root@compute ~]# cat /proc/7827/status          //       PID    
Name:   kvm-pit/7820
State:  S (sleeping)
Tgid:   7827
Ngid:   0
Pid:    7827
PPid:   2
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 64
Groups:
Threads:        1
SigQ:   0/192346
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: ffffffffffffffff
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
Seccomp:        0
Cpus_allowed:   ffff
Cpus_allowed_list:      0-15          //         0-15 CPU 
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        158
nonvoluntary_ctxt_switches:     0

[root@compute ~]# taskset  -cp 6-8 7827               // 7827     6-8 CPU 。
pid 7827's current affinity list: 0-15
pid 7827's new affinity list: 6-8

[root@compute ~]# cat /proc/7827/status 
Name:   kvm-pit/7820
State:  S (sleeping)
Tgid:   7827
Ngid:   0
Pid:    7827
PPid:   2
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 64
Groups:
Threads:        1
SigQ:   0/192346
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: ffffffffffffffff
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
Seccomp:        0
Cpus_allowed:   ffff
Cpus_allowed_list:      6-8              //   
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        158
nonvoluntary_ctxt_switches:     0

一、I/Oスケジューリングアルゴリズムのチューニング1、Linux I/Oスケジューラ(Linux I/O Scheduler)Linuxカーネルの構成部分を紹介し、汎用ブロック層とブロックデバイスドライバの間にあり、ユーザーはこのスケジューラを調整することでシステム性能を最適化することができる.2、I/Oスケジューリングの4種類のアルゴリズム
1)CFQ(完全公平スケジューラ.プロセスは平均的にIO帯域幅を使用する)CFQはI/O帯域幅へのアクセスを均一に分布し、プロセスが飢え死にして低い遅延を実現することを回避し、deadlineとasスケジューラの折衷であり、CFQはマルチメディアアプリケーション(video,audio)とデスクトップシステムにとって最も良い選択である.CFQはI/O要求に優先度を与えるが、I/O優先度要求はプロセス優先度とは独立しており、優先度の高いプロセスの読み書きは自動的に高いI/O優先度を継承することができない.原理:CFQは、プロセス/スレッドごとに、プロセスによって発生する要求を管理するためのキューを個別に作成する、すなわち、プロセスごとに1つのキューが作成され、各キュー間のスケジューリングはタイムスライスを用いてスケジューリングされ、各プロセスがI/O帯域幅に良好に割り当てられることを保証する.I/Oスケジューラは、1プロセスあたり4回の要求を実行します.
2)NOOP(エレベータ式スケジューラ、通常メモリメモリに用いる機器)はLinux 2にある.4またはそれ以前のバージョンのスケジューラは、このI/Oスケジューラアルゴリズムしかなく、NOOPはエレベータのワークマスター法のようにI/O要求を組織し、新しい要求が来た場合、要求を最近の要求に統合し、同じメディアを要求することを保証する簡単なFIFOキューを実現した.NOOPは餓死して読む傾向があり、書くのに有利であり、NOOPはフラッシュメモリデバイス、RAM、組み込みシステムにとって最も良い選択である.エレベーターアルゴリズム餓死読み取り要求の解釈:書き込み要求は読み取り要求よりも容易であるため、書き込み要求はファイルシステムcacheを通じて、書き込み完了を待つ必要がなく、次の書き込み操作を開始することができ、書き込み要求はマージを通じてI/Oキューに蓄積され、読み取り要求はその前面のすべての読み取り操作が完了するまで待たなければ、次の読み取り操作を行うことができず、読み取り操作の間に数ミリ秒の時間がある.その间にリクエストが来て、お腹が空いて死にました.
3)Deadline(遅延スケジューラの場合、I/Oごとに遅くとも実行時間があります.)時間とハードディスク領域を分類することで、この分類と統合はnoopのようなスケジューラを要求し、Deadlineは1つの締め切り時間内にサービス要求を確保し、この締め切り時間は調整可能であり、デフォルトの読み取り期限は書き込み期限より短く、書き込み操作が読み取り不能で餓死する現象を防止することができる.Deadlineはデータベース環境(ORACLE RAC,MYSQLなど)に最適です.
4)Anticipatory(AS)(Deadlineアルゴリズムのようなイニシアチブスケジューリングであるが,予測機構を導入して性能を向上させる.本質的にはDeadlineと同じですが、最後の読み取り操作後、6 msを待たなければ、他のI/O要求のスケジューリングを続行できません.アプリケーションから新しい読み取り要求を購読し、読み取り操作の実行を改善することができますが、いくつかの書き込み操作の代わりに、6 msごとに新しいI/O操作を挿入し、いくつかの小さな書き込みストリームを大文字の入力ストリームに統合します.書き込み遅延で最大の書き込みスループットをスワップすると、ASはファイルサーバなどの多くの環境に適しており、ASはデータベース環境に悪い.
2、centos 7を修正する.XのI/Oスケジューリングアルゴリズム
[root@controller ~]# cat /sys/block/sda/queue/scheduler          //        I/O    
[noop] deadline cfq 
[root@controller ~]# dmesg | grep -i scheduler                //         IO    
[    1.007667] io scheduler noop registered
[    1.007671] io scheduler deadline registered (default)
[    1.007694] io scheduler cfq registered
	

[root@controller ~]# echo cfq > /sys/block/sda/queue/scheduler        //    I/O    :
[root@controller ~]# cat /sys/block/sda/queue/scheduler        
noop deadline [cfq] 


[root@controller ~]# grubby --update-kernel=ALL --args="elevator=deadline"        //     I/O    :

[root@controller ~]# reboot

[root@controller ~]# cat /sys/block/sda/queue/scheduler

noop [deadline] cfq 

        I/O   :
[root@controller ~]# vi /etc/default/grub
  “GRUB_CMDLINE_LINUX=”     elevator=cfq
  :
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet elevator=noop numa=off"
[root@controller ~]# grub2-mkconfig -o /boot/grub2/grub.cfg         //        ,BIOS-Based。
[root@controller ~]# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg               //UEFI-Based。
[root@controller ~]# reboot