2019年9月10日火曜日

【OrangePi,Linux】RAMディスクを作成する

前回ようやくOrangePiにカメラを取り付け、
そこから画像を撮影することが出来たわけです。

で、監視カメラのような使い方をする場合で、
動画を撮影してストリーム配信~とかだとちょっと話は別なんですが、
今回のように画像として格納するという形をとった場合、
定期的に撮影するような機能だったとして、
ハードディスクへかなりアクセスが発生するんじゃないかと思いました。

そんなところへの問題解決(になるの?)






______________________________

はじめに



OrangePiなどで監視カメラを作成する際に、
撮影する写真をため込むじゃないですか。


結果データとして格納する分はいいと思うんですが、
解析前データのような、実際には貯めこまなくてもいいデータまで書き込んでしまうと
ハードディスクへ負担が増えるのではないか…と
(OrangePiとかはタダでさえMicroSDなので寿命が厳しそう)


調べてみると書き込みや読み込み等、MicroSDカードへのアクセスを
繰り返し繰り返し行うことによって、寿命は来てしまうそうです。
ドライブレコーダーなどには寿命長めのMicroSDカードが使われているとか。
(高いヤツですね!)

SDカードの寿命と延命方法。容量512GBで8630円というmicroSDカードの価値


となると、できるだけカードへの書き込みは少ない方がいい。
書き込み回数は必要最小限にする。
という風にしたいなと思いました。



______________________________

RAMディスクとは?



ここで、このハードディスク(HDD)への書き込み回数を減らす方法として、
RAMディスクというものがあるらしいです。
Wiki:RAMディスク


一体どーいうもんかというと、
起動時だけ使用できる、メインメモリの一部をHDDとして使用することが出来る
という機能がRAMディスクというものらしいです。
見た目上は他の物理HDDと同じような形で使用できるのだとか。


メインメモリで管理している領域なので、
電源を切った際に内容がクリアされてしまうという問題はありますが、
アクセスが高速なのと、アクセスによる摩耗はないそうです。


後者の部分ですね!



______________________________

LinuxでのRAMディスクの作成方法



Linuxではtmpfsという仕組みを使用するようですね。
試してみましょうか。


1.rootでログインする


とりあえずログインしましょう




2.dfコマンドで「/dev/shm」を確認する


dfコマンドで現在の状態を確認しておきましょう
「Mounted on」の項目に「/dev/shm」があれば大丈夫です。


df




真ん中あたりに「/dev/shm」というのが見えますね。
これがあればとりあえず大丈夫です。


3.RAMディスクの作成

RAMディスクマウント用のディレクトリを作成して、そこにマウントします。
マウント時にサイズを指定するみたいですね。
作成するディレクトリの名前とかは自由でいいと思います。


mkdir /var/tmp/ramdisk
sudo mount -t tmpfs -o size=16m /dev/shm /var/tmp/ramdisk

出来たらdfで確認してみましょう。

df -h

成功していれば、マウントしたramdiskが認識されると思います。






RAMディスクが作成されていれば、あとはこの領域を
読み込み、書き込みの領域として使用して大丈夫です。


現在使用しているOrangePiZeroは256MBモデルなので、
メモリは256Mです。
この中からRAMディスクの容量として16M割り当てて
ramdiskという領域を作成した…という感じでしょうか。



______________________________

ベンチマークしてみよう



wikiで見た感じだとRAMディスクはアクセスが早い、らしいのですが、
実際の速度はどうなのでしょうか?

ddコマンドというブロック単位でファイルコピー、変換を行うものがあり、
行うと転送速度が表示されます。
これで物理HDDとRAMディスクで一定数処理を行って測ってみましょう。



今回は8MしかRAMディスクを作成していないので、
8Mの範囲内で測定してみましょう。
下記のコマンドで8Kのブロックを1000回コピー(=合計8M)した場合、
どの位で行えたのかの測定を行っています。


// 物理HDD
dd if=/dev/zero of=/var/tmp/zero bs=8k count=1k conv=fdatas
ync
// RAMディスク
dd if=/dev/zero of=/var/tmp/ram/zero bs=8k count=1k conv=fd
atasync


実行したところ、下記の様になりました。



書き込み速度に関しては下記の様になりました。

・物理HDDで行った場合は1.24508秒かかり、1秒における転送率は6.7MB
・RAMディスクで行った場合は0.117788秒かかり、1秒における転送率は71.2MB

大体10倍位差が出ていますね。
ちょっと大きめのファイルを作成したりすると結構差が出てきそうです。



ちなみに、ifとofの部分を入れ替えることで読み込み速度の測定も出来ます。
出来ますが…こちらはちょっと思ったより差が出なかったので割愛。
どちらとも0.07秒くらいかかり、1秒における転送率は120MB前後となりました。

ARM機器でやるとなんか警告を吐くので正しく測定出来ているか不安ですが、
読み込みに関しては物理HDD、RAMディスクでほぼ差は出ない
ということのようですね。



アクセスによるディスクへの負担を軽減するのが主な目的でしたが、
一時ファイルを書き込む場合の速度向上等でも恩恵がありそうですね!
ただ、RAMディスク容量をメモリから分けてもらうので、
容量に関してはそのときにどのくらい必要なのか?
ボードのスペックはどのくらいなのか?
そのあたりとの相談になりそうですね。



______________________________

おわりに



今回はRAMディスクというものを使用して、
HDD上に直接書き込みを行うのではなく、
メモリをディスクに見立ててそこに書き込みを行う方法を行いました。


撮影した画像ファイルから複数の一時ファイルを作成して処理…
結果としてはオリジナルの画像ファイルと結果ファイルの2ファイルだけ
等といった場合は
一時ファイル関連はRAMディスク上で、結果のファイルのみHDD上に書き込む
というような感じにするといいのかな~と思います。


こうするだけでもHDDへの書き込み回数がかなり減りますし。
一時ファイル作成も早くなりますし、いいのではないでしょうか?


IoT機器等はどうしても長時間動作、長時間測定を行うものが多く、
そうなると稼働率や稼働時間(寿命)等は品質の部分に影響してくると思います。
現時点ではそういったところまで気にする地点に到達してはいないんですが、
将来必要になるだろうと予想して、勉強しておこうと思います。


0 件のコメント:

コメントを投稿