DB勉強会レポート_2019年02月13日(水)実施分

こんにちは。

DB勉強会レポートをこれまで6本(紹介記事を合わせると7本)公開してきましたが、お陰様で多くのTechRacho読者の方にお読み頂いております。
平素は格別のご贔屓を賜りまして誠にありがとうございます。
これからもDB勉強会レポートならびにTechRachoを宜しくお願い致します。

解説範囲

平成30年度 春期 データベーススペシャリスト試験 午後Ⅱ 問1

設問2

[性能見積り・評価]の”DBサーバの性能見積り”の記述中のe ~ fに入れる適切な数値を答えよ。


p.15を開いて下さい。
問題文中にいくつか用語が出てきますが、これらが理解出来ないと何を問われているのかさえピンときませんので、今一度確認しておきましょう。

用語 定義
トランザクション 複数の処理を1つにまとめたもの。
* 詳細はQiitaの解説を参照して下さい。
ターンアラウンドタイム システムに処理要求を送ってから、結果の出力が終了するまでの時間。データやコマンドの入力が終了してから、処理結果の出力が終わって次の要求の受け入れが可能になるまでの時間のこと。
* これに対し、処理要求の投入が完了してから、処理が終わって出力が始まるまでの時間(システムの処理を待っている時間)のことをレスポンスタイムという。
I/O 機器やシステムなどに、外部からデータや信号を入力(input)したり、外部に出力(output)したりすること。また、そのための回路や装置、ソフトウェアなどのこと。

それでは、空欄を埋めていきましょう。

まずeですが、CPUの1トランザクション当たりの処理時間を問うています。
「(2) DBサーバの性能見積もりの前提」の②と④に目を転じると、以下の情報があります。

② CPUの1データページ当たりの処理時間は, 0.2ミリ秒である。
④ トランザクションごとに, 平均50データページにアクセスする。


よって、「0.2ミリ秒/データページ × 50データページ/トランザクション」より、eには10ミリ秒が入ります。
単純な計算問題ですね。


続いてfです。
こちらも単純計算で求められます。
1トランザクション当たり10ミリ秒かかるので、200トランザクションでは「10ミリ秒/トランザクション × 200」で求めることが出来ます。
ただし、単位は「秒」ですので「1000」で除算することをお忘れなく。
解答として、fには2秒が入ります。

時折ミリやナノの乗数を忘却したり混同することがあるかと思いますので、誦んずる自信がない方は今一度以下の表で確認しておきましょう。

単位 10n 10進数表記
テラ(tera) 1012 1,000,000,000,000
ギガ(giga) 109 1,000,000,000
メガ(mega) 108 1,000,000
キロ(kilo) 103 1,000
ミリ(mili) 10-3 0.001
マイクロ(micro) 10-6 0.000001
ナノ(nano) 10-9 0.000000001
ピコ(piko) 10-12 0.000000000001

続いてgです。
この空欄を埋める前に、p.15の「1. 性能見積り」にある以下の説明を確認して下さい。

一般経費申請も, 同様に締日前にピークが見込まれるので, 一般経費申請で必要となるCPUの性能見積もりを行った。


つまり、一般経費申請の「200トランザクション/秒」を考慮してCPUの数を計算することになります。
ここは非常に見落としやすいポイントだと思います(私自身が見落としました)。

さて、問題文の情報とこれまでに導いた解答を元に一つの使用率100のCPU%のパフォーマンスは以下の通りです。

  • 0.2ミリ秒/データページ
  • 10ミリ秒/トランザクション
  • 2秒/200トランザクション

「(1) 性能要件」より、1秒間に200トランザクションを処理することが要求されます。

一つのCPUの使用率を80%に落とすと、「80 ÷ 100」より1.25倍の処理時間がかかります。
つまり、「2秒/200トランザクション × 1.25」より200トランザクション当たり2.5秒かかります。
この処理時間を、80%の使用率で1秒にするのが性能要件です。
そのために何個もCPUが必要になるでしょうか。

やりたいこととしては、CPU個数をn個に増やしてその分処理時間を短縮して最終的に1秒にしたい。
よって、「2.5秒 ÷ nCPU = 1」という式が成り立ちます。
この式を解くと「n = 2.5」、つまり使用率80%のCPU2.5個で処理時間1秒/トランザクションが実現出来ます。
ただし、CPUの個数は整数でしか存在し得ませんので、小数点以下を切り上げる必要があります。
よって、gには3個が入ります。


続いてhです。

問題文中にある「バッファヒット率」とは何でしょうか?
端的に言えば、メモリ上にデータキャッシュやログバッファが存在する確率です。
とはいえ、そもそもバッファとは何のために、どこに存在して、どんな種類があるのかを理解していなければなりません。
技術評論社の記事が非常に分かりやすくまとまっているので、以下の項目の理解に自信のない方はぜひ一読しておくことをおすすめします。


上記の解説ページを読むと、バッファヒット率はデータキャッシュがメモリ上に存在しない場合の1トランザクションあたりの処理時間を問うていることが分かります。
さて、「データベースのバッファヒット率が0%」の場合ですが、この場合はメモリ上にデータが存在しないので、全てストレージ上のデータにアクセスして取り出さなければなりません。
それにどのくらいの時間が掛かるのでしょう?
「(2) DBサーバの性能見積もりの前提」の③と④を見ると、以下の情報を確認出来ます。

③ 1データページ当たりのストレージへのI/O時間は, 20ミリ秒である。
④ トランザクションごとに, 平均50データページにアクセスする。


「データベースのバッファヒット率が0%」なので、50データページ分全てストレージを見に行かなくてはなりませんので、1ランザクション当たりのI/O時間は「20ミリ秒/データページ × 50データページ/トランザクション」で求めることが出来ます。
よって、hには1000ミリ秒、つまり1秒が入ります。


最後にiです。
バッファヒット率が60%のCPU処理時間とI/O時間の合計を求めます。

バッファヒット率が60%ということは、「50データページ/トランザクション × 0.6」より、 30データページはメモリに存在し、残りの20データページはストレージ上に存在します。
また、問題文より、1データページ当たりの処理時間は以下の通りです。

  • CPU – 0.2ミリ秒
  • I/O – 20ミリ秒

まずはCPU処理時間から求めていきましょう。
CPUは50データページ分の処理を行いますので、「0.2ミリ秒 × 50データページ」より「10ミリ秒」が求まります。
恐らくここでメモリ上に存在する30データページで計算してしまう読者の方がいらっしゃると思います。
その場合、ストレージ上の20ページはメモリ上に読まれただけで何の処理もされないことになってしまいます。
あくまで、50データページ/トランザクション全体を処理します。

そして、I/O時間を求めます。
ここではストレージ上に存在する20ページ分のI/O時間を求めれば良いわけです。
よって、「20ミリ秒 × 20データページ」より「400ミリ秒」が求まります。

CPU処理時間とI/O時間を合計すると「10ミリ秒 + 400ミリ秒」より「410ミリ秒」が求まりますが、解答の単位は「秒なので」「1,000」で除算することをくれぐれをお忘れなく!
よって、iには0.41秒が入ります。

設問3

[クラウドサービスの選定・評価]について, (1) ~ (3)に答えよ。


まず最初に、この設問は経費採算システムの「旅費交通費精算機能」、「一般経費精算機能」、「仮払金精算機能」のうち、どれを対象にしているかを把握し、探すべき情報を明らかにする必要があります。
p.15の「2. 評価」の説明を確認すると、以下のような記述があります。

現行システムの旅費交通費精算機能のDBサーバには, CPU及び周辺機器の増設が必要となるが, 現行システムの機器が2年後に更新時期を迎えることから, クライアントサービスの利用を検討する。


上記より、このクラウドサービスは「旅費交通費精算機能」のために利用するのだと分かります。

(1)

サービスの選定について, ①, ②に答えよ。

性能見積りによって求められた, 経費精算システム全体のDBサーバに必要な仮想CPU数を答えよ。また, 表8から, 選定条件を満たす専用サーバのクラス名を一つ答えよ。


P.17の「1. サービスの選定」の(3)を見て下さい。

(3) 基本サービスでは, 障害発生時に復元されたデータベースに, コミット済みのトランザクションによる更新が反映されていないこともあり得るので, スタンバイサーバ設定のオプションを使用する。


DBサーバは、専用サーバーとスタンバイサーバの計2台必要になります。

次に、p.17の「1. サービスの選定 (2)」① ~ ③を確認して下さい。

① 表8の仮想CPU単体の性能は, DBサーバも性能見積りの前提としたCPU単体の性能に相当する。
② メモリサイズは, 12Gバイト以上必要である。
③ 必要な仮想CPU及びメモリサイズの条件を満たす, 必要最低限のクラスを選択する。


①より、クラウドサービスのDBサーバーにも設問2のgと同じ3個のCPUが必要になります。
ただし、専用サーバとスタンバイサーバの計2台ですので、必要なCPUの個数は計6個です。
p.16の「表8 専用サーバのクラス」で上記の条件を満たすのは「C4」または「C5」ですが、p.17の「1. サービスの選定 (2)」③より、条件を満たす必要最低限のクラスを洗濯します。

よって、解答としては

  • 仮想CPU数: 8
  • クラス名: C4

となり、p.17の「1. サービスの選定 (2)」の②にあるメモリ要件も満たします。

基本サービスで, 復元されたデータベースにコミット済みのトランザクションによる更新が反映されていないことがあるのはどのような場合か。具体的に35字以内で答えよ。


p.17の「(1) 基本サービス」の③を見て下さい。

データベースの更新ログは, 5分ごとにバックアップストレージに保存される。この場合ストレージは, データベースが使用するストレージとは別に用意される。


一般的なトランザクションについての理解に不安のある方は、まずはこちらを一読してから読み進められることをお勧めします。

基本サービスにおけるトランザクションを確認しましょう。
p.17「(1) 基本サービス」の③をご覧下さい。

③ データベースの更新ログは, 5分ごとにバックアップストレージに保存される。この場合のストレージは, データベースが使用するストレージとは別に用意される、


イメージとしては、以下の図のようになります。


コミットをすると更新ログ(俗に言うログファイル)に更新内容が記録され、5分ごとにバックアップストレージに保存されます。
* 図では省略していますが、更新ログの中身はチェックポイントでデータファイルに反映され、DBの更新が行われます。

さて、この場合にコミット済みのトランザクションによる更新が反映されていないことがあるのは、どのような場合が想定されるでしょうか。
コミット済みのトランザクションの情報は更新ファイルが持っています。
もしDBサーバに障害が発生しても、DBMSの再起動時にバックアップストレージにある更新ファイルを参照して自動的にトランザクションを再実行すれば、障害発生前のコミット済みの変更を復元出来る訳です。
しかし、コミット後に障害が発生した際にバックアップストレージに更新ファイルが保存されていない場合は、障害発生前のコミット済みの変更は雲散霧消します。

ここまでの説明を整理するため、以下の図をご覧下さい。


障害発生時点で復元出来るのは、3つ目の更新ログに記録されたコミット済みのトランザクションまでです。
その後、2つのコミットが行われていますが、バックアップストレージに保存する前に障害が発生しているので、更新情報は消えてしまっており、復元不可能です。
つまり、「ある更新ログをバックアップストレージに保存してから障害が発生するまでの間に更新がコミットされた場合、その分の更新情報は消えてしまう」のです。

以上を35字以内にまとめると、復元されたデータベースにコミット済みのトランザクションによる更新が反映されていないことがあるのは、「更新ログの保存から障害発生までの間に更新がコミットされた場合」となります。

今回の設問の解答

  • 設問2
    • e. 10
    • f. 2
    • g. 3
    • h. 1
    • i. 0.41
  • 設問3
    • (1)
        • 仮想CPU数: 8
        • クラス名: C4
      • 更新ログの保存から障害発生までの間に更新がコミットされた場合

参考ページ

次回解説予定範囲

平成30年度 春期 データベーススペシャリスト試験 午後Ⅱ 問1 設問3 (2) – (3)

関連記事

DB勉強会レポート_2019年02月22日(金)実施分

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ

BPSアドベントカレンダー