ストレージメモリへの参照が有する性質について

## MSR-Cambridge Traces
### 解析の対象ついて
まず、解析の対称となるMSR-Cambridge Tracesについて簡単にまとめます。
Microsoft Research Cambridgeが公開している、サーバ（おそらくWindows searverの)ディスクのアクセス履歴です。

ダウンロードは[https://ci.nii.ac.jp/naid/20001651868/](https://ci.nii.ac.jp/naid/20001651868/)から可能です。

２つのgzipファイルを解凍すると、README.txtと36個の *.csv.gzが得られます。
ファイルは３６個ですが、ワークロード（Traceを取得したserver）は１３種類です。
各Traceファイルには、\<hostname>_\<disknumber>のような名前が付けられています。

例えば、hm_0.csvとhm_1.csvはhostname:hmから取得した、Disk0とDisk1です。
Disk0はsystemないしbootディスク（WindowsのCドライブ）に相当するとありますが、一部例外もあるとのこと。

csvファイルのフォーマットは、
Timestamp,Hostname,DiskNumber,Type,Offset,Size,ResponseTime
となっています。一例としてhm_0.csvを示すと

~~~
128166385295514663,hm,0,Write,9056014336,2048,2833
128166385295514878,hm,0,Write,11855351808,512,2617
128166385295515175,hm,0,Write,5548077056,4096,2320
128166385301451520,hm,0,Write,3163095040,40960,3438
128166385301453920,hm,0,Write,3154132992,4096,1037
...
~~~

となっています。
1. Timestampは"Windows filetime"という100ns単位のtimestamp
2. Hostname とDiskNumberはファイル名と同じ
3. Typeは"Read"もしくは”Write"
4. offset、lengthはbyte単位での読み書きの開始ポイントのoffsetと長さ。長さは最小で512byte単位（ブロック）
5. Response time はI/Oが発行されてから完了までの時間

アドレスデータが並んでいても分からないので、可視化してみましょう。

### 下準備
まず、扱いやすくするためにいくつかの加工を行います。

1. 不要な情報を消去する（workload名とかDisk No.などは、ファイル名を見れば良いだけなので不要です。またResponce timeも今回は使いません）
1. Timestampを記録開始時間を０に合わせ、ns(ナノ秒） -> s（秒）に変換
1. OffsetもRequest Lengthも最小で512Byte単位なので512で割る
1. Offset, Request Lengthというは使いにくいので全部アドレスに変換する。このとき、データ削減のため、16kB単位のアドレスとする。（これをPage Addressと呼ぶことにする）
1. Page Addressをリナンバリングする

複数のプログラムで上記の処理を実現しました。スッキリ書けたらどこかにアップするかも。

処理後のファイルの一例(hm_0)を示します。

~~~csv 
0,Write,103883
2.15e-05,Write,124307
5.12e-05,Write,90871
5.12e-05,Write,90872
0.5936857,Write,83511
~~~

前から順にTimeStamp,Write/Read,PageAddresがずらずらと記載されています。
ブロックデバイスは、始点（Offset）とリクエスト長でアクセスするため、PageAddressが一個一個書いてある形式は冗長にはなっていますが、可視化するという目的では扱いやすくなっています。
（512Byte単位のBlockAddressのまま扱うと、ファイルサイズが大き過ぎてプロットするだけでも時間がかかるため16kB単位のPageAddressで扱います）

### Traceの可視化
WriteとReadの区別はさておいて、一旦リクエストをプロットしてみましょう。
workload hmのDisk0とDisk1をプロットしてみます。

workload:hm (hm_0, hm_1)
<img width="300" alt="hm_0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/eb506cef-4f23-b451-13cc-00d9cf47a505.png"> <img width="300" alt="hm_0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/bb16a26c-4d93-30aa-d8e8-40c9c1320917.png">

workload:mds(mds_0, mds_1)
<img width="300" alt="mds_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/1ccb8ebd-8fec-32aa-304b-9a998db9efd0.png"><img width="300" alt="mds_1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/0dbacdc8-1c7c-d93e-6d16-45cc6bd4bcc5.png">

workload:prn(prn_0, prn_1)
<img width="300" alt="prn_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/c185cfd1-04a9-cae8-e407-9fa6bcce31f4.png"><img width="300" alt="prn_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/2814059b-d363-dd3a-763b-43cd5fa21366.png">

workload:proj(proj_0,proj_1,proj_2,proj_3,proj_4)
<img width="300" alt="proj_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/ebdc8732-b04f-e26d-2909-5237f36f80fb.png"><img width="300" alt="proj_2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/e5c7daab-ca92-ec01-5161-ce049db8c970.png"><img width="300" alt="proj_1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/e08a102f-e999-5155-9f32-672f12720efe.png"><img width="300" alt="proj_3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/ca955ab6-c225-070a-70a6-2824d0ddc6a0.png"><img width="300" alt="proj_4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/46d4c897-05e3-fde0-2b01-e4eb5c6a3f50.png">


workload:prxy(prxy_0, prxy_1)
<img width="300" alt="prxy_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/c0e735df-7a35-fac4-1529-6c517698e2fe.png"><img width="300" alt="prxy_1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/48f0e03e-fa4a-0c63-b9ba-a69cf33993aa.png">

workload:rsrch(rsrch_0, rsrch_1)
<img width="300" alt="rsrch_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/1033ce93-9390-8549-1291-ec5680110b53.png"><img width="300" alt="rsrch_1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/0554a3cd-688d-5e88-6dac-94bee1feaf27.png"><img width="300" alt="rsrch_2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/fbbc1e5a-f531-a185-235e-ff23a67b370b.png">

workload:src1(src1_0, src1_1, src1_2)
<img width="300" alt="src1_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/a64c93a2-53f7-3e1e-8c77-6de12936b31f.png"><img width="300" alt="src1_1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/d9c36d09-bf25-ae32-25b1-3cccb9e92296.png"><img width="300" alt="src1_2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/fd960659-10d6-30f7-4bc1-1dd07d31acb1.png">

workload:src2(src2_0, src2_1, src2_2)
<img width="300" alt="src2_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/976680fe-b0dc-e45b-302e-c130aa3d2974.png"><img width="300" alt="src2_1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/fabd2e24-c614-7bf6-44aa-6b50360d059d.png"><img width="300" alt="src2_2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/3fd76806-a1f9-ed44-fffb-4ba6016d417c.png">

workload:std(stg_0, stg_1)
<img width="300" alt="stg_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/570322b3-21e8-2d6e-617c-ac1d77f6aa0a.png"><img width="300" alt="stg_1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/cc3b66c7-23ec-f90f-820e-4327d208655d.png">

workload:ts(ts_0)
<img width="300" alt="ts_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/62b5c6a6-56fd-96c5-dc26-5f2a9350a3b4.png"> 

workload:usr(usr_0, usr_1)
<img width="300" alt="usr_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/a625ddb1-1b9d-7565-bf06-407bb72a687e.png"><img width="300" alt="usr_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/c00ec9ac-85b8-699c-5884-0df5659bb9c6.png">

workload:wdev(wdev_0, wdev_1, wdev_2)
<img width="300" alt="wdev_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/ca8e7333-ef41-5a2d-f489-2e583da671fb.png"> <img width="300" alt="wdev_1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/9741d39f-6844-5ff3-dc67-6aad47db88be.png"> <img width="300" alt="wdev_2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/b82fe052-444b-acf8-ac23-7e6f9a6fcec6.png"> <img width="300" alt="wdev_3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/bfc0926a-b74b-d7ed-84b7-3c989132c0cf.png"> 

worload:web(web_0, web_1, web_2, web_3)
<img width="300" alt="web_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/5fa8c9b3-df50-ef62-4938-cc3029e56aa6.png"> <img width="300" alt="web_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/3cf1caa6-9459-6608-aad3-a500ac4ed707.png"> <img width="300" alt="web_2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198144/949dea47-6cc8-5db7-220e-5c2d5053e92b.png"> 


ごちゃごちゃして何がなんだか分からないかもしれませんが、Diskが違っても似たような形をしていたり、アクセスが集中する時期が同じようなタイミングだったりと、やはり同一のWorkloadに起因していそうだなー、くらいのことは見て取れます。（定量的には議論しません）

また、prxy_0やrsrch_0、wdev_0などのTraceでは、ある範囲のアドレスが斜線で網掛けされたような模様になっていますが、これはその範囲のアドレスにループ的な参照が生じていることを表しています。メモリへのアクセス（参照）には、時間的局所性、空間的局所性、逐次的局所性の３つの局所性(locality）が知られていますが、これは逐次的局所性の一例と言えます。