Yesterday I was reading over some Kubernetes documentation and ran across the abbreviation MiB. I almost ignored it and kept reading. It seemed to just mean megabytes as in 256 MiB meaning 256 megabytes or 256*1024*1024 bytes. It was here:
“For example, if you set a memory request of 256 MiB for a container…”
Why in the world are they saying 256 MiB instead of 256 MB? I figured it didn’t really matter and was about to skip it when I decided to do a quick Google search and that took me down this rabbit hole.
Evidently MiB is short for mebibytes – https://simple.wikipedia.org/wiki/Mebibyte.
As expected, 256 MiB is the same as what I call 256 megabytes. But it gets a lot hairier. It seems that there is a standard that has been around for years which redefines a megabyte as 1 million bytes. As far as I understand it, IEC 60027-2:2019 is the current standard for names for the number of bytes. Look at the history of this publication here:
It seems like the IEC 60027-2 standard has been evolving since 1972, but Wikipedia says it was published in January 1999:
This page has a nice summary I think of the standard:
It says that a megabyte is 1000000 bytes and a mebibyte is 1048576 bytes.
This is all very bizarre to me, and I shared it in my team’s chat and my manager said he sees MiB a lot dealing with storage. But we joked that it also looks a lot like an abbreviation for Men in Black:
But I guess that would be MIB not MiB. 🙂
Digging further into Google searches I found this very amusing history of how quantities of bytes have been described down through history:
How cool is that? So, I tried to get a grip on myself and make sense of why Kubernetes is using MiB.
Evidently with meters mega means 1000000 meters. So, maybe this is like the controversy when I was a child where they tried to get the United States to convert to the metric system. Trying to get everyone to call 2^20 bytes a mebibyte and 10^6 bytes a megabyte will probably be an uphill battle for it to become standard just as the metric system never took hold in the US.
But in Kubernetes you are forced to think this way. Later in the same manual page it describes two suffixes: M and Mi. It says that 129M is about the same as 123Mi. 129M would just be 129,000,000 bytes. 123 Mi is 123*1024*1024 = 128974848 bytes.
But in all my work with Oracle 1M has always been 1024*1024 = 1048576 bytes. For example:
SQL> CREATE TABLESPACE TEST DATAFILE '/tmp/test.dbf' SIZE 1M; Tablespace created. SQL> host ls -l /tmp/test.dbf -rw-r-----. 1 oracle dba 1056768 Nov 22 10:18 /tmp/test.dbf
In this example the database tacks on an 8192 bytes header block to the 1048576 bytes of allocated space to create a 1056768 byte file. (1048576+8192=1056768)
So, working with Oracle M means 2^20 bytes but in Kubernetes 10^6. In Kubernetes Mi means 2^20 bytes.
For fun search the Oracle manuals for the word “mebibyte” and you will find a couple of entries for 19c and 21c which is amusing.
In my Oracle work I use the following definitions:
kilobyte = 1024 bytes = K
megabyte = 1024 kilobytes = M
gigabyte = 1024 megabytes = G
terabyte = 1024 gigabytes = T
As Oracle’s database software works today these are good definitions.
Outside of the Oracle database these values might be named kibibyte, mebibyte, gibibyte, and tebibyte abbreviated Ki, Mi, Gi, and Ti.
No space aliens involved. At least, none that I remember… 🙂