システムテストの必須項目(7)・高負荷エージングテスト

2021年9月16日テスト品質

高負荷の時の安定性を確認するには高負荷エージングが大切です

組み込みソフトの安定動作を確認するには高負荷エージングのテストは大切ですが、高負荷エージングテストで効率良く潜在バグを見付けるには、装置が高負荷と過負荷の状態を行ったり来たりするように、高負荷エージングのテスト条件を決める必要があります。

高負荷と過負荷とが交互にが発生している時には、組み込みソフトの中では通常の負荷の状態ではあまり実行されない処理が頻繁に実行されるので、そこにバグが潜在していると問題が起きます。高負荷エージングテストは、その様な潜在バグを洗い出すためのテストです。この記事では高負荷や過負荷が掛かっている時の組み込みソフトの内部の動作を元に、高負荷エージングテスト条件を考える時の注意点について紹介していきます。

高負荷の状態では組み込みソフトは内部に実行待ちの処理を貯めこむ

どの様なソフトでも外部の装置からの通信やオペレータの入力を介して処理の要求を受け取り、その処理を実施して結果を返すという事を繰り返します。同じ処理の要求が複数の外部の装置から届いたり、複数の複数のオペレータから同時に入力されたりする場合も起きます。そのような状態が起きた時の処理の方法についての設計方針は ①1つの処理が終わるまでは次の処理は受け付けないので後から届いた処理の要求にはエラーで返す か ②複数の処理の要求を受け付けて内部に貯めておいて順番に処理をして結果を返す のどちらかになります。

組み込みソフトの場合はリアルタイム性やマルチタスク性が求められる事が多いので、②の内部に処理の要求を貯めこむという設計方針を採用する事が多いです。この内部に処理の要求を貯めこむには、割と複雑な仕組みが内部に必要になってくるので、そこに潜在バグが潜んでいる可能性が出てきます。そのためにその潜在バグを洗い出す高負荷エージングが必要になってきます。

高負荷エージングテストでは高負荷と過負荷の間を行ったり来たり

組み込みソフトが処理の要求を内部に貯めこむ機能を持っている場合には、処理の負荷の高さは大まかに以下の4つに分けて考える事ができます。

  1. 低負荷 :内部の処理待ちの要求を1つも貯めこんでいない状態(処理の要求には即座に応答される)
  2. 通常負荷:内部の処理待ちの要求が溜まっているが7割分以下の状態(処理の要求は少し待てば応答される)
  3. 高負荷 :内部の処理待ちの要求が9割以上溜まっているがまだ溢れてはいない状態(待ち時間が長くなる)
  4. 過負荷 :内部に処理待ちの状態が満杯でこれ以上は貯めこめない状態(処理不可とエラー応答が返される)

内部に処理の要求を貯めこむ機能がある場合、単位時間あたりの処理性能を超えた処理の要求が一時的に発生しても、その処理の要求は内部に貯めこまれた上で順番に処理されていきます。これが通常負荷の状態ですが、その様な状態からさらに負荷が高くなっていって内部に貯まる処理の要求が増えいって貯めこめる最大の処理要求の数の9割を超えてくるといよいよ貯めこめない限界が近づいてきて危うくなってきます。これが高負荷の状態です。高負荷の状態からさらに処理要求が溜まってしまい、いよいよ内部に貯めこむ事もできなくなると、それ以降に到着した処理の要求は処理不可能としてエラー応答が返す過負荷の状態になってしまいます。

様々な潜在バグが見つかるのは、この高負荷状態で時々過負荷になってまた高負荷に戻る、という高負荷と過負荷を行ったり来たりする程度の高負荷の状態です。ですので、高負荷エージングテストではこの高負荷と過負荷の境界の負荷を狙って負荷を掛けてエージングを行います。

高負荷や過負荷の状態で組み込みソフトの中では何が起きているのか?

高負荷の状態でも内部に貯めこまれた要求が限界を超えていなければ別に問題はありません。通常の処理の登録と実行が繰り返されているだけで、処理を要求した側から見ても応答が返ってくるのが遅いだけで通常の処理が行われます。川の上流に作られたダムで例えると、満水の水位まで近づいてきたけどまだ満水になってなくてギリギリ耐えてる状態です。

しかし、ここからさらに負荷が高まって過負荷の状態になると、遂には内部に要求を貯めこむ限界を超えてしまいます。限界を超えるとそれ以上は内部に処理を貯めこめないので、それ以降に来た処理の要求は受け付けられずに処理不可能としてエラー応答を返します。この時に、組み込みソフトの内部では準備していた処理要求を貯めるデータの満杯処理が動いています。

キュー構造なら空きのキューを取り出そうとして残キュー無しの応答が返されるとか、テーブル構造なら空きエントリ無しのエラーが返される等です。このような準備していたデータの最後の1つを使い切ってもう残りが無い時の処理は、ソフトの中では通常の処理とは異なる動きが必要になる特殊処理です。特殊処理なのでいろいろと注意する事も多く、バグが潜みやすいのです。ダムの例で言うと、いよいよ満水になってダムが溢れるので緊急放流をする場面ですね。緊急放流は通常は行わない特殊な処理なので、川の下流域に警報の放送をしたり関連する役所に連絡したりと、いろいろと注意する事が多くなるのとよく似ています。

高負荷と過負荷の切り替えの狭間に潜むバグ

高負荷から過負荷になると、ソフト内部では処理要求を貯めこむデータの最後の1つを使い切る処理が実行され、その後は処理の要求にエラー応答が返されるようになります。 エラー応答を受けて、処理を要求した側でもエラーに対応する処理が動きます。 一方で、過負荷が解消して高負荷に戻る時には、ソフト内部では処理要求を貯めこむデータ構造の空き枠の最初の1つが出来てそれが空き枠を管理するための管理データに登録されます。この最初の1つの処理も通常は滅多に動かない特殊処理なので、ここにもバグが潜みやすいのです。

高負荷と過負荷を行ったり来たりするという事は、高負荷と過負荷の切り替えが頻繁に起きているという事です。このような、何かの状態を別の状態に切り替える、という動き事態もソフトのバグが潜みやすい箇所ですし、さらに内部でデータの空き枠の最後の1つを使い切るとか最初の1つを管理に入れるというような、境界データの処理もまたバグが潜みやすい箇所です。

ですので、高負荷エージングテストではこのこれらの箇所に潜む潜在バグを洗い出すために、高負荷と過負荷を行き来するような負荷をかけた状態で長時間動作させるエージングを行うのが良いです。

高負荷エージングでは何の負荷をどれだけ掛けるかの設計が必要

このように、高負荷エージングでは高負荷と過負荷を行き来するような負荷を掛けるのが、ソフトの潜在バグを洗い出すのに効果的です。そこで大切になってくるのが、何の負荷を掛けるのかという事です。負荷を掛けるという事は言い方を変えると大量の入力を短時間に突っ込むという事です。なので高負荷を掛ける対象はその装置の入力全てです。

通信の受信機能があれば受信の負荷について高負荷エージングをする、何かの処理を受け付ける機能があれはその処理の要求の負荷についいて高負荷エージングをする、画面入力があればその入力について高負荷エージングをする、など様々な高負荷エージングが考えられます。それらの高負荷エージングは、単独に実施しても良いのですが装置のCPUやメモリというハードウエア資源に対して高負荷を掛けるという観点からは、全ての入力に対する高負荷エージングを同時に実施するという考え方もあります。

いずれにしても、どんな種類の負荷に対してどの程度の高負荷や過負荷を掛けてどの程度の期間エージングを行うのかは、テスト対象の装置によって変わってくるので、テスト設計の段階でよく検討して効率的な高負荷エージングテストを行いましょう。

高負荷エージングでは負荷を取り去った後の復帰の確認も忘れずに

最後になりますが、高負荷エージングテストを行った後には、全ての高負荷を取り除いて通常の負荷に戻した状態で、装置が普通に動作している事を確認する、高負荷からの復帰の確認も忘れずにテスト項目に入れておきましょう。

高負荷と過負荷の状態を行き来する時には動いていても、そこから通常の負荷の戻った後に動作がおかしくなっているというような潜在バグも稀にあります。原因としては高負荷と過負荷の切り替えの処理の中で何等かの動的資源のリークが起きていたとか、内部の状態遷移が異常になっていたというような場合です。そのような事になっていないかを確認するために、高負荷からの復帰の確認も大切です。

高負荷エージングの次ぎは品質の悪い通信路でのエージングです

高負荷エージングテストは入力のある装置であれば全ての装置で実施ができるテストです。次は通信機能を持つ装置だけが対象ですが、品質の悪い通信路でのエージングテストも装置の安定性を確認する上で大切ですので、次ぎの記事で紹介しましょう。