はじめに
問題です。Windows のファイル転送時によく見かける下図についてです。速度が『1.00 MB/s』となっていますが、Mbps (Mega bit per second) に変換するとどうなるでしょう?
8 Mbps と答えた方。実は (たぶん) ちょっと違います。
容量 (bits, Bytes)の単位
一般に容量を示す KB や MB , GB, TB のように、"B" が大文字で表記される場合、それは Byte (バイト) を意味します。冒頭の図のように MB/s と書かれている場合、メガバイト/秒という意味になります。
1 Byte = 8 bit ですので、1 MB と言われたら、一般には 8 Mbit (メガビット) を意味します。速度の単位 bps もそうですが、bit を表す場合は小文字の "b" を使うことが多いです。
ところで、M (メガ) は何かというと、一般には 10 の 6 乗を意味します。なので 1 MB = 8 × 106 = 8,000,000となります。
先程から『一般には』と表現しているのには訳があります。というのも、文脈によっては M (メガ) は 2 の 20 乗を意味するからです。
なので文脈によっては 1 MB = 8 × 220 = 8,388,608となります。
国際単位系 (SI) と国際規格 IEC 80000-13 の定義
国際単位系 (SI) の定義では M (メガ) は 10 の 6 乗を意味します。
一方、情報工学の世界では 2 進数を扱うことが多く、それゆえ M (メガ) を 2 の 20 乗の意味で使うことが便利でした。
そこでこの 2 つを区別するため、国際規格 IEC 80000-13 においては Mebi (メビ) という単位が定義され、これが 2 の 20 乗を意味するようになりました。
それ以外にもキロバイトに対してキビバイト、ギガバイトに対してギビバイト、テラバイトに対してテビバイト、といった定義がされています。(下表)
国際単位系 (SI) | IEC 80000-13 | ||
---|---|---|---|
Kilo (キロ) | 103 | Kibi (キビ) | 210 |
Mega (メガ) | 106 | Mebi (メビ) | 220 |
Giga (ギガ) | 109 | Gibi (ギビ) | 230 |
Tera (テラ) | 1012 | Tebi (テビ) | 240 |
Peta (ペタ) | 1015 | Pebi (ペビ) | 250 |
なので国際単位系 (SI) と国際規格 (IEC 80000-13) の定義を『正しい』とすることを、この記事では『一般に』と表現しています。
Windows や Linux での定義
では一般ではないものにはどういうものがあるかというと、現在の IT の主要な OS である Windows や Linux での容量の定義です。
これらの OS では IEC 80000-13 で定義された KiB, MiB, GiB, TiB のことを、それぞれ KB, MB, GB, TB と表記しています。
例えば Windows の 1023 バイトのファイル (下図左) と 1024 バイトのファイル (下図右) を見比べてみると、1024 バイトに達することでファイルサイズが 1 KB になっていることが分かります。
速度 (bps) の単位
一方、速度に関して言うと、Kbps や Mbps は国際単位系 (SI) の定義のみが使われます。K (キロ) であれば 10 の 3 乗ですし、M (メガ) であれば 10 の 6 乗です。
おそらくこの辺りは IEEE 規格の定義が強く出ているためと思われます。
例えば 1000Base-T では『1 クロック = 8 ns (ナノ秒) の中で 2 bit を表現するペアケーブルが 4 対で伝送』します。それゆえ速度は 2 [bit] / (8 × 10-9) [sec] × 4 = 109 [bps] = 1 [Gbps]となります。
同様に、無線の IEEE802.11a でも『4 μs (マイクロ秒) の中で 6 bit を表現するサブキャリア 48 個で伝送 (そのうち 1/4 は誤り訂正符号)』します。それゆえ速度は 6 [bit] / (4 × 10-6) [sec] × 48 × 3/4 = 54 × 106 [bps] = 54 [Mbps] となります。
無線の理論速度などの原理の詳細については以下をご参照下さい。
Windows や Linux でもネットワーク通信は IEEE 規格で行うことが多く、データ容量と速度の単位における K (キロ) や M(メガ) の定義に不整合が起きているのです。
最初の問題の答え
これまでの話をもっても、Windows の MB/s の MB が 106 なのか 220 なのか分かりません。ただ、よく観測してみると、998 KB/s となっている場合がある一方、
0.98 MB/s と表現されている場合があります。そして速度がこれ以上の場合は MB/s 表記が維持されます。
もし 1MB/s = 1000 KB/s であるならば 998 KB/s という表現はされず、0.99 MB/s となるはずです。そうなっていないということは、1MB/s = 1024 KB/s であることが推測されます。
なお、この速度のキャプチャを取るために、『ポリシーベースの QoS』という Windows 標準機能を使いましたが、その設定値として 1 MBps を設定して閉じてまた開くと 1024 KBps に変わっていましたので、この説がさらに補強されます。
この推測が正しいとすると、冒頭の 1 MB/s は 8,388,608 bps ≒ 8.4 Mbps となります。
容量が小さいうちは大した話ではない。だが、、、
今までは MB/s の定義について触れてきましたが、大きな誤解の元としては、速度を表現する bps については国際単位系の 10 の乗数が使われるのに対し、Windows , Linux 等の OS 上ではデータ容量を表現するのに 2 の乗数が使われる、という不整合があることです。
この不整合を認知しないと、思わぬ計算違いをしてしまうこともあります。
例えば Windows サーバ上に 1 TB のファイルがあるとします。これをネットワーク越しに別の Windows サーバに移動します。ストレージの IO は十分高いとし、ネットワークが 1000Base-T でシステム上のボトルネックになるとします。
一般に 1 TB を 1 Gbps で移動するには 1 × 1012 [Byte] × 8 [bit/Byte] / 109 [bps] = 8 ×103 [sec] ≒ 2時間 13分 となります。
ですが Windows 上では TiB ですので 1 × 230 [Byte] × 8 [bit/Byte] / 109 [bps] ≒ 8590 [sec] = 2時間23 分となります。
つまり、1 TB で 10 分の開きが出てきます。
最近では大容量化が進んでいますので、例えば 20 TB 分のファイルを移動するなら 200 分も変わってきます。
ファイルサーバの移行などの理論値試算の際には、ご注意を。
コメント