BIOSチューニング メモ

## BIOS項目
### HTT(ハイパースレッディング・テクノロジー)
<details><summary>使用されていない演算回路</summary>
CPUの演算装置には、整数加減算・シフト演算・論理演算などいくつかの定まった機能を持つ演算回路が組み込まれている。
ざっくりと演算回路のカテゴリを一覧すると以下のようになる。
(1)整数の加減算
(2)シフト演算(左シフトで値は二倍に、算術右シフトで二分の一に。他に論理シフトなど)
(3)論理演算(AND,OR,XOR)
(4)比較判定(大小比較の判定)
(5)ロード(メモリからレジスタへコピー)
(6)ストア(レジスタからメモリへコピー)・
(7)実数四則演算(実数の計算は整数とは全く異なる)
(8)条件分岐(一致・不一致の条件によってジャンプする)

「整数の加減算」の中に加算回路・減算回路が存在する。
「論理演算」の中にも論理積回路(AND)・論理和回路(OR)・排他的論理和回路(XOR)がある。
それぞれの演算回路カテゴリの中でさらに詳細に、具体的な機能に対応したいくつもの演算回路がある。

パイプラインで解説した、一つの命令サイクルで実行(EX:エクスキュート)する演算回路は一つだけである。
整数の加算回路を実行しているとき、他のシフト演算や実数の加算・減算・乗算・除算や比較判定回路などは、使用されていない。
左シフト演算回路を実行しているときも、加算回路など他の演算回路は使用されていない。
　
つまり演算回路は、どれか一つの演算回路を使用しているとき、他の演算回路は空いている。演算装置は常に一部分しか使用されていない。
これは計算機資源として勿体ないことだ。
　
そこで、この空いている演算回路を使用して、計算速度を向上させるテクノロジーが生み出された。
</details>


<details><summary>二つの命令サイクルを同時に動かす</summary>
そのテクノロジーでは、使用していない演算回路を活用する為に、プロセッサの物理コアの中の、プログラムカウンター・スタックポインター・汎用レジスタなど命令サイクル実行に必要なコア内の記憶装置(レジスタ類)を、それぞれ全てコア内に二重に設置し、一つの物理コアで二つの命令サイクルを同時並列に実行できるようにしている。
制御装置(制御ユニット)やCPU内のキャッシュ(高速記憶装置)などは、共有している。

ある本では制御装置内にプログラムカウンターがあるが、どういうことだろう？？？
→分かれていた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/f1e046dc-9eff-8894-8274-bc967b2d6a4f.png)

> CPU構造：
https://elite-lane.com/central-processing-unit/
> 

このテクノロジーの名をハイパースレッディング・テクノロジー(Hyper-Threading Technology : HTT)と呼ぶ。
ハイパースレッディングはインテルの固有技術の名称で、AMDではサイマルテイニアス・マルチスレッディング(Simultaneous Multi-Threading : SMT)という呼称が使用されている。
基本的に両者は同じような技術である。

パイプライン制御では6つの手順の命令サイクルを1手順ずつ遅らせることで、同時に6つの命令サイクルを動かしているが、1クロックで稼働しているEX:エクスキューズは常に一つだけである。
　
ハイパースレッディング・テクノロジーでは、1クロックでEX:エクスキューズが二つ同時に稼働する。
もちろん6つの手順 IF,ID,OA,OF,EX,RS が全て同時に二つ稼働する。
レジスタ群が二重に存在し、二つの命令サイクルのレジスタ群が独立しているので、それぞれ同時並行で実行可能となる。

但し、同じ演算回路を何度も繰り返す場合は、一つのEX:エクスキューズしか稼働しない。

例えば多数の商品の合計値を求めるときなど、整数の加算命令ばかり連続で実行するかも知れない。

この場合は整数の加算回路は物理コアに一つしかないので、一つの命令しか実行できない。

一つしか無い整数加算回路を同時に二つ実行することはできない。

**そのため、同時に二つの命令サイクルを実行できると言っても、マルチコアのように完全に二つの命令サイクルを同時実行できるわけではなく、プログラムの内容によっては一つしか実行できない場合もある。
だから単純に計算速度が二倍になるわけではない。**

ハイパースレッディング・テクノロジーはRICSプロセッサの技術なので、パイプライン制御も同時に実装できる。
現代のプロセッサは全て、ハイパースレッディング・テクノロジーにより、二つのパイプライン制御を同時実行している。

以下はイメージ図だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/529e9c1c-54b2-2355-1b63-32db9ced4599.png)

</details>


### Turbo Boost(ターボ・ブースト・テクノロジー)
<details><summary>ターボブーストとは</summary>
インテルCore iシリーズに搭載されている機能。簡単に言うと、定格である動作周波数よりもさらに早く、自動的にプロセッサコアを動かすことができる働きをする。

CPU開発の中でメジャーになった複数のコアをもつマルチコアですが、データ処理を2つ以上のコアで分散させることにより、処理速度を上げるメリットがある。

**しかし、マルチコアはマルチスレッドに対応していないソフトではあまり役に立たない。**
最近ではクアッドコアやオクタコアが次々と出てきていますが、対応ソフトも同じスピードで普及しているかと言えば疑問が残る。**そこで、必要と判断した際に動作周波数を上げて、高速処理を実現するターボブーストが力を発揮する。**

:::note info
シングルタスク処理を行うプログラムに利点が大きいと思われる。
:::


</details>

<details><summary>コア数の状態で変化するターボブースト</summary>
4つのコアをもつクアッドコアを例に、ターボブーストを詳しく解説する。
それぞれのコアには、電源の供給をストップさせるパワーゲートというスイッチがある。このスイッチがターボブーストのカギで、重要な役割を果たす。

通常は、定格の動作周波数で4コアが一定に動作している状態である。これがCPUの環境などにより2コアの動作で十分と判断されると、残りの2コアのスイッチが切られ、代わりに動作している2コアの動作周波数が上がる。こういった状態をクロックアップと呼び、規定値よりも性能をアップさせた状態となる。
</details>

<details><summary>ターボブーストのクロックアップ効果</summary>
クロックアップは定格のCPUより性能がアップされる。オーバークロックと混同されることもありますが、オーバークロック(Intel製CPUの末尾にKがついているものは使える。AMD製CPUは基本的に全てのモデル対応。)はターボブーストによるクロックアップとは少々違う。

オーバークロックとは、設定された規格以上の働きをさせることである。これだけならクロックアップと同じような気がするが、オーバークロックはBIOSの設定を変更してクロックアップさせている。動作周波数を上げて性能を上げているので、大きな負荷が掛かって発熱し、最悪は故障する恐れもある。

対してターボブーストのクロックアップは、コンピュータ側で消費電力や発熱が管理されている。つまり一時的に性能が上がったとしても保証範囲内の動きなので、安全に行われているというわけである。
</details>


https://www.dospara.co.jp/5info/cts_str_parts_tboost.html


<details><summary>パフォーマンスカウンタ</summary>
Processor Performance\Processor Frequency
Processor Performance\% of Maximum Frequency
</details>


### コアパーキング
<details><summary>details</summary>
Windows Server ではWindows Server 2008 R2で新機能としてコアパーキング機能が追加された。コアパーキングとは、複数コアのあるCPUに対して全てのコアをフル回転して使用させるのではなく、そのプロセスが動くのに十分なコアを確保する機能である。結果として少数のコアを使用することになり消費電力を抑える。

だが、この説明だと、実態と一致しない部分がある。実際には、「保留」と表示されている論理プロセッサも、多くの場合、CPU使用率が０％ではないのだ。本当に上記の引用通りに「不必要なコアを保留状態にしてコアを減らす」のであれば、保留中の論理プロセッサのCPU使用率は0％になるはずだ。

不可解に思いいろいろ検索していて、ようやく見つけたのが、[「Core Parking (保留) とは何か？」](https://jingyo.seesaa.net/article/201208article_1.html)という古い記事だ。この記事によると、「保留」の意味は、「不必要なコアを保留状態にしてコアを減らす」のではなく、CPUのスケジューラによるスケジューリングから除外する目印にすぎず、保留の印がついた状態の論理プロセッサにも、スケジュールされることがある、ということだ。

この機能は0.1秒単位で働き、可能な限りCPUの保留状態を作っていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/8276a0b6-8d9c-6151-fa55-a62200b4ef51.png)

リソースモニターで確認すると一瞬ですが保留状態が確認できました。

さて、この機能の制御はできるのか？

マイクロソフトに問い合わせしたところ、この機能はユーザーによる制御などはできないそうです。

https://red-souls.jp/ichounoki/rnote/memo/20221020_221631158463.htm
https://mctjp.com/2009/12/02/%E3%82%B3%E3%82%A2%E3%83%91%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6/
https://tooljp.com/qa/D299A515D374D02949257D2F005C3875.html
</details>


<details><summary>機能切り替え方法</summary>
https://jingyo.seesaa.net/article/201208article_2.html

https://blog.putise.com/%e3%83%aa%e3%82%bd%e3%83%bc%e3%82%b9%e3%83%a2%e3%83%8b%e3%82%bf%e3%83%bc%e3%81%aecpu%e4%bf%9d%e7%95%99%e3%81%a8%e3%81%af%e4%b8%80%e4%bd%93%e4%bd%95%ef%bc%9fwindows-server-2008%e3%81%ae%e3%82%b3/ 

http://painapousoda.blog.fc2.com/blog-entry-14.html
</details>

<details><summary>HTとの関係</summary>
start /affinity 
使用したいコア番号位置の0を1にします。
例えば、「1と2、6と7のコアだけを使用する」場合は以下画像のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/8d0cb4fc-46e8-d92e-4e50-3c249e051f6f.png)


「保留」とは、CPUが停止している状態ではなく、可能な限りスケジュールの対象から外すための単なる目印だという事だ。その結果としてCPUはIdleになり通常は省電力状態になるが、必要があればスケジュールされる事もありえるし、スケジュールされた時に保留フラグが解除される事はない。

https://jingyo.seesaa.net/article/201208article_1.html
</details>

<details><summary>パフォーマンスモニタ</summary>
Processor
Processor infomation
の32コア分のProcessor TimeとIdle Timeを監視
Processor Performance\Processor State Flags
</details>



### Cステート
CPUのアイドル時の状態を定義したものです。CPUがアイドルのとき省電力機能により状態が変化します。どのような状態になるかはCステートが定義しています。



<details><summary>パフォーマンスモニタ</summary>
Processer\% C1 Time
Processer\% C2 Time
Processer\% C3 Time
Processor Performance\Processor State Flags

</details>







### L3キャッシュの容量割り当てについて

<details><summary>CPUキャッシュ</summary>
CPUのモデルによって、若干の違いはあるが、次の図のようになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/dcb6c19a-b68d-a517-6113-d7f4525b0ad4.png)

L1キャッシュには、Instruction(命令)キャッシュとData(データ)キャッシュがある。
このキャッシュとは、現金のことではなく、データを一時的に保存しておく技術のcacheである。
メインメモリよりもCPUに近い位置にあるキャッシュメモリからデータや命令を読み込むことで、アクセスの時間を短縮でき、性能の向上に繋がる。
L1キャッシュのそばにはMMU(Memory Management Unit)と呼ばれる部品があり、ここでは仮想アドレスと物理アドレスの変換を行う。そこで利用されるキャッシュが、TLB(Translation Lookaside Buffer)と呼ばれる。
L1とL2キャッシュは、CPUのコアごとにあるが、L3キャッシュはソケットで共有されている。
ソケットとは、CPUをマザーボードに装着するための、穴の開いた板状の部品で、ピンを差し込んで固定して使用する。
コアは、実際に演算を行う部分である。今ではソケットに複数のコアを搭載しているタイプが多い。


https://wild-tech.jp/2021/08/17/2304/


</details>

<details><summary>1次キャッシュ(L1キャッシュ/プライマリキャッシュ/一次キャッシュ)</summary>
複数段階の異なるキャッシュメモリを搭載したプロセッサにおいて、最も終戦的に読み書きが行われるもの。最も高速に動作するが最も容量が少ない。

2段階以上のキャッシュを内蔵している場合に用いられる呼称で、プロセッサ内部のレジスタに次いで読み書き動作が高速な[**メモリ**](https://e-words.jp/w/%E3%83%A1%E3%83%A2%E3%83%AA.html)を指す。1次キャッシュに収まりきらないデータは2次キャッシュへ格納される。[**パソコン**](https://e-words.jp/w/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3.html)向けのプロセッサ製品では数[**KB**](https://e-words.jp/w/%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9.html)（キロバイト）から数十KB程度の容量であることが多い。
</details>

<details><summary>2次キャッシュ(L2キャッシュ/セカンダリキャッシュ/二次キャッシュ)</summary>
複数段階の異なるキャッシュメモリを搭載したプロセッサにおいて、1次キャッシュに収まりきらないデータを格納するために設けられているもの。

1次キャッシュより動作は低速だがメインメモリよりは桁違いに高速で、容量も1次キャッシュよりは多い。2次キャッシュに収まらないデータは3次キャッシュがある場合は3次キャッシュへ、ない場合はメインメモリへ格納される。

2次キャッシュはパソコン向けのプロセッサ製品では数百KB（キロバイト）から数MB（メガバイト）の場合が多く、1次キャッシュの数十倍に及ぶことも少なくない。
</details>


<details><summary>3次キャッシュ(L3キャッシュ/三次キャッシュ)</summary>
複数段階の異なるキャッシュメモリを搭載したプロセッサにおいて、2次キャッシュに収まりきらないデータを格納するために設けられているもの。

2次キャッシュより動作は低速だがメインメモリよりは桁違いに高速で、容量も2次キャッシュよりは多い。3次キャッシュに収まらないデータは4次キャッシュがある場合は4次キャッシュへ、ない場合はメインメモリへ格納される。

キャッシュメモリを3次まで用意するプロセッサ製品はあまり一般的ではなく、[**費用対効果**](https://e-words.jp/w/%E3%82%B3%E3%82%B9%E3%83%88%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9.html)よりもとにかく単体の性能向上を重視する一部の[**サーバ**](https://e-words.jp/w/%E3%82%B5%E3%83%BC%E3%83%90.html)向けハイエンド製品に稀に見られるのみである。搭載している場合は十数MB（メガバイト）から数十MBと、2次キャッシュの数倍から十数倍程度の容量であることが多い。
</details>

コア間で共有されている3次キャッシュの容量を特定のコアに割り当てられないか？




## ボトルネックとなりうる主要項目
すべての処理工程がボトルネックになりえますが、しかし、比較的ボトルネックになりやすい箇所というのは決まっているようです。こちらの記事にわかりやすく書かれていたので引用します。

I/Oにはディスクやネットワーク，メモリなどがありますが，メモリがボトルネックになることはまずありません（メモリが小さくてスラッシングが，というのはメモリI/O自体に話ではないですね⁠）⁠。つまりインフラエンジニアが取り組むパフォーマンスチューニングはディスクとネットワークが対象のことが多い，ということになります。さらにさらにいえば，ネットワークよりはディスクのほうがネックになるケースのほうが格段に多いです。ここにCPUも入れて考えてみると，ディスク，CPU，ネットワーク，メモリという順にボトルネックになりやすい気がします（もちろんケースバイケースです⁠）⁠。つまり，まず最初に習得するべきはディスクI/Oについてです。
https://gihyo.jp/admin/serial/01/eng_knowhow/0019?page=1

https://qiita.com/yutoo89/items/1d130e2780084121a7de


## パフォーマンスカウンタの選択

### メモリ



| カテゴリ | カウンタ | 説明 | ボトルネック指標 |
|-|-|-|-|
|Memory|Available MBytes|利用可能なメモリ容量をMB単位で表示。|   |
|Process|Working Set(_Total)|・プロセス（アプリケーション）が利用するメモリサイズのうち、物理メモリ上で確保されているサイズを表します。<br>・もしこの値が増減する場合はページングが発生している疑いがあり、物理メモリが不足している可能性があります。|   |
|Memory|Pages/Sec|・１秒当たりのページング（物理メモリとディスクの間のデータのロードや退避）の回数を表示します。<br>・ページングの処理が発生すると、メモリ内のデータの処理に時間がかかってしまう。そのため、ページングの回数は少ない方が望ましい。<br>・一般的にページングが多発する場合は物理メモリが不足している可能性があります。<br>・物理メモリが足りているのにページングが発生する場合は、一時的に大きなサイズのアロケーションをしている可能性あり。|20以内<br>参考：https://azuread.net/archives/3207|
|Memory|% Commited Bytes In Use|・仮想メモリの使用率。<br>・(Commited Bytes)/(Commited Limit)を計算した値を％で表示。|   |
|Memory|Commited Bytes|・仮想メモリの使用量。<br>・コミット済みの仮想メモリのサイズをバイト数で表示。<br>・このサイズが物理メモリより小さい場合、物理メモリを増設してもボトルネックが解消するとは考えにくい（どちらかというとプログラム側の作りに問題がある可能性がある）<br>・ちなみにメモリ ダンプ作成時には、メモリの状態が pagefile.sys にコピーされるため、仮想メモリの設定も必要になります。参考：https://trackwalker29.rssing.com/chan-15169500/article94.html|   |
|Paging File|% Usage|仮想メモリの使用量を％で表示。|   |


### CPU
| カテゴリ | カウンタ | 説明 | ボトルネック指標 |
|-|-|-|-|
|Process|% Processer Time(_Total)|プロセス単位でCPU使用率を％表示したもの。<br>どのアプリがCPUを消費しているか？を切り分ける際や、特定のアプリケーションを対象にリソース監視をする場合に利用できます。||
|Processer|% Processer Time(論理コア分)|CPU使用率を％表示したもの。<br>タスクマネージャのCPU欄に表示される値と同じもの。|   |
|Process|% User Time|・CPU使用率のうち、ユーザーモードで消費した割合を「プロセス単位」で％で表示したものです。<br>・どのプロセスを対象に取得するかはカウンタの追加時に選択可能。|   |
|Processer|% User Time(_Total)|・CPU使用率のうち、ユーザーモードで消費した割合を％で表示したもの。<br>・ユーザーモードでの消費とは、アプリケーションでの処理を意味しており、もし「% Processer Time」に占める割合が高い場合はアプリを落とす等の対処が必要となります。|   |
|Processer|% Privileged Time(_Total)|・CPU使用率のうち、カーネルモードで消費した割合を％で示したもの。<br>・カーネルモードでの消費とはOSの動作による使用等であり、もし「% Processer Time」に占める割合が高い場合はサービスを落とす等の対処がある。|   |
|Processer|Interrupt/Sec(_Total)|・ハードウェアの割り込みをプロセッサが毎秒に処理した回数です。<br>・基本的に周辺機器の速度はCPUに比べて非常に遅いため、通常は周辺機器が処理している間にCPUは別の処理をしています。<br>・周辺機器の処理が完了した事を通知する方法の一つに「ポーリング」（CPUが定期的に周辺機器の完了をチェックする処理）がありますが、他の処理に影響を与えるため、逆に周辺機器の処理が完了したらCPUに割り込みで完了通知を送る方法が主流になっています。|   |
|Processer|% C1 Time(論理コアごと)|プロセッサーがC1低電力アイドル状態にある時間を％表示。<br>プロセッサーC-Stateと呼ばれる低電力アイドル状態になっている時間を％で示す項目。<br>C1,C2,C3の順番で復帰時間が短く、特にC3の場合はキャッシュの一貫性が保証されない。|   |
|Processer|% C2 Time(論理コアごと)|プロセッサーがC2低電力アイドル状態にある時間を％表示。|   |
|Processer|% C3 Time(論理コアごと)|プロセッサーがC3低電力アイドル状態にある時間を％表示。|   |
|System|Processor Queue Length||   |


https://rainbow-engine.com/perfmon-memory-important-counters/



### ディスク
| カテゴリ | カウンタ | 説明 | ボトルネック指標 |
|-|-|-|-|
|Physical Disk|% Disk Time(_Total)||50%～100%|
|Physical Disk|Current Disk Queue Length(_Total)||平均2以上|
|Process|IO Data Bytes/Sec(_Total)|||
|Physical Disk|Disk Writes/Sec(_Total)|||
|Physical Disk|Disk Reads/Sec(_Total)|||
|Physical Disk|Disk Bites/Sec(_Total)|||
|Physical Disk|Avg. Disk Sec/Write(_Total)|||
|Physical Disk|Avg. Disk Sec/Read(_Total)|||
|Logical Disk|Current Disk Queue Length(Dドライブ)|||
|Logical Disk|Avg. Disk Queue Length(Dドライブ)|||
|Logical Disk|Avg. Disk Read Queue Length(Dドライブ)|||
|Logical Disk|Avg. Disk Write Queue Length(Dドライブ)|||


<details><summary>見方</summary>
まずは、 Queue Length が瞬間的に上下しているのか、常に高い状態にあるのかをご確認いただければと存じます。
Queue Length が急上昇後すぐに降下し、グラフがスパイク状になる場合、実行待ちは短期間で解消されていると判断できます。
一方で、 Queue Length の値が常時高い傾向にある場合や、上昇傾向にある場合は、調査が必要です。
</details>


https://rainbow-engine.com/perfmon-disk-important-counters/

https://technet440.rssing.com/chan-6827930/article27559.html

### ネットワーク



### ボトルネック指標

https://it-infra-ya.com/win-perfcounter/

https://www.oracle.com/jp/technical-resources/articles/ats-tech/tech/useful-class-9.html



## 設計書
https://jp.fujitsu.com/platform/server/primergy/technical/construct/pdf/win-memory-dump.pdf