File_cache

事始め タイトルの通りです。 OSはね、頻繁にアクセスされるファイルをメモリ上に載せておくんですね。ディスクアクセスは基本的に遅くなってしまうからね。その辺をいい感じにまとめておきたいのよね。 参考文献 [この方の記事] (https://qiita.com/ryuichi1208/items/bbf221ab66562e1426ca) [Linuxとメモリの基礎&vmstatの詳しい使い方] (https://qiita.com/kunihirotanaka/items/70d43d48757aea79de2d) カーネルは、ディスク上のデータへのアクセスを高速に行うため、 read/writeの際にメモリ上にデータをキャッシュします。 キャッシュするメモリ上の領域を「ディスクキャッシュ」と 呼びます。 ディスクキャッシュには種類が2種類があります。それが「バッファキャッシュ」と「ページキャッシュ」です。 それぞれの概要は下記へ記します。 ちなみに、空きメモリがある限り、基本的にキャッシュはどんどん増加します。 ページというのは Linux の仮想メモリの最小単位。 ページキャッシュは、ディスク上のデータをページ単位で一時的に 保存するために使用されるメモリでファイルの読み書きの高速化に 使用されます。 バッファキャッシュは、プロセスがディスク上のデータに アクセスする際、アクセスすべきデータのブロックを高速に見つけるために使用されるメモリ メモリの状態を確認する方法 メモリの使用状況はfrreeコマンド、もしくはvmstatコマンドで確認することができる。 それを使う前に まず、基礎として覚えておきたいのが、osのメモリ構造だよね。 実メモリがあって、メモリには3つの領域がある。 1つ目が、使用中のメモリ。 2つめが、キャッシュ。 3つ目が、空きメモリ。」 さらに、HDD等に、スワップ領域があるんだよね。 使用中のメモリは、カーネルとアプリケーションなどのプロセスによって使用されているメモリのこと。 キャッシュとは、HDDやSSDアクセスなど、I/Oの高速化を行うためのキャッシュとして利用されるメモリのこと。空きメモリは、使用中のメモリとキャッシュに使われなかったメモリ。 使用中のメモリが増えると、空きメモリが減る。 空きメモリがある限り、基本的にキャッシュはどんどん増加する。 空きメモリがなくなれば、使用中のメモリの増加に応じて、キャッシュが減る。 キャッシュに割り当てられるメモリがなくなると、I/Oのパフォーマンスは低下する 使用中のメモリが実メモリより多くくなりそうになると、あふれる部分をスワップへ書き出す。 vmstatの結果 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 1560 157622480 336252 333521088 0 0 0 3 0 0 9 0 91 0 0 freeの結果 total used free shared buff/cache available Mem: 494649720 3144036 157647192 53880 333858492 488291996 Swap: 4194300 1560 4192740 freeの方がわかりやすいよね。だから、freeを使うことにしよう。 total:合計メモリ量 used:メモリ使用量 free:全く使われていない未割当のメモリ量 shared:共有メモリで使用しているメモリ量 buff/cacheファイルバッファ+キャッシュメモリに使われているメモリ量 available:プロセスが利用できるメモリ量 ...

January 7, 2024 · 7 min · 1391 words · Me

Posix_and_filesystem

ことはじめ いやー、研究でね、1プロセスからマルチスレッドで、ストレージから多次元配列データのサブセットを並列読み出しをする必要があってね。 HDF5っていうライブラリは、全配列データを一つのファイルで管理する一方で、 TileDBは配列データを複数のファイルに分けて管理しているんですね。 で、ですよ。前にも説明した通り、HDF5を使ってPararell readをしようとすると、 なんと性能がスケールしないんですよね。で、HDF5の公式サイトを見ると、HDF5はマルチスレッドをサポートしていないって書いてあったんですよ。 ただね、「マルチスレッドをサポートしていない」っていうのは、OSとのやり取り、具体的には、ファイルシステムとか、スレッドとか、その辺でインタラクションが生じて、 「マルチスレッドをサポートできない」んだと思うんですよね。 というのもね、chatGPTに聞いた話によると、 POSIX I/O operations, by default, do not provide built-in support for parallel reading of a single file from multiple threads. When multiple threads attempt to read from a single file concurrently using POSIX I/O functions, there is a potential for race conditions and data corruption because POSIX I/O operations do not provide automatic synchronization between threads for file access. ってことなんですよね。でね、システムがどのファイルシステムを使っていたかっていうとね、ext4なんですよね。でね、ext4はPOSIX互換なんですよね。 つまり、どうやら、HDF5がマルチスレッドをサポートしていないのではなく、 ext4が単一ファイルの並列読み書きをサポートしていない可能性が高くなってきた。 まだ確証は得られていないのですが。ということで、今からファクトチェックをしていきたいと思っています。 ...

January 5, 2024 · 2 min · 249 words · Me

Filesystem_performance_bench

事始め 研究で開発しているミドルウェアがストレージからの読み出しをするんだよね。しかもparalellに。でもね、なんか知らないけど、paralellの数が3になるとめちゃめちゃ遅延が発生するようになってしまったんだよね。これなんでやと。気になったわけですよね。で、いろいろ調べようと思ったんです。 復習だけど、ファイルシステムとは 物理ストレージにビットを書き込むわけです、保存するためには。ただね、これ、どこにどういう風に書き込むか、というのはすごく面倒くさいんですよね、プログラムから管理するのは。だから、保存操作を抽象化してくれるソフトを作ったわけです。 ファイルシステムというね。ファイルシステムはOSにもともと組み込まれているもので、Linux-kernelを見ると確かにfsっていうディレクトリがある。 で、ファイルシステムはLinux-kernel越しに使うので、I/Oはシステムコールになるって話ですね。はい。 ストレージのパーティションに構築されたファイルシステムの種類を確認 df -Th このコマンドで確認できます。 ストレージへの読み書き速度ベンチマーク ddコマンド The dd command is a simple way to test sequential read performance. You can use it to read a large file in parallel from multiple processes. Here's an example: ってのでもらったexample scriptがこちら # Create a large test file (if it doesn't already exist) dd if=/dev/zero of=testfile bs=1M count=1000 # Use multiple dd processes to read the file in parallel for i in {1..4}; do dd if=testfile of=/dev/null bs=1M iflag=direct status=none & done # Wait for all dd processes to finish wait fioコマンド こっちの方が使いやすいと思う、のでこっちを使うことに使用 ...

December 7, 2023 · 1 min · 210 words · Me

パーティションとファイルシステムについて簡単にまとめた

パーティションとは ディスクに作られた論理的な仕切りのこと。OSはディスク単位、およびパーティション単位でディスクを認識する。まず気をつけたいのがパーティション=ファイルシステムではないということ。パーティションは、文字通り物理的なディスク上に作られた論理的な仕切り。そして、ファイルシステムはパーティションごとに作られ、OSに認識される。さらに、ファイルシステムっていうのは、データの置き場所だけではなく、そこからデータを取り出すソフトの部分も指すということは肝に銘じておきたい。 パーティションテーブル(MBRとGPT) mbr,gptのはなし。 ディスクの先頭にかかれたセクター(512bit)は特別な領域である。ここにはディスク上のパーティションの構成情報を格納しているパーティションテーブルが存在する。パーティションテーブルには様々なフォーマットが存在するが、現代、最も使われているのはMBRとGPTである。だが、MBRには2つの大きな制限がある。作成可能なパーティションの最大容量の制限と、ブートモードの制限である。 パーティションの最大容量の制限は、パーティションのセクタ管理に使われるbit数が原因である。MBRはセクタ管理に32bitを使っている。1セクタ=512バイトであるため、2^(9+32) = 2048.0Gbyteということになる。一方、GPTは2^64byteまでパーティションを作ることが可能である。 また、ブートモードの違いに関しては、近年のUEFIはMBRに対応していないため、MBR形式のディスクにインストールされたOSはUEFIのマザーボードではブートが不可能となる。 fdiskを使ってハードディスクにパーティションを作る(GPTを作る場合はgdiskを使う) Linux上でMBRにフォーマットされたパーティションをファイルシステムの一部に組み込むまでの流れを説明する。なお、例ではfdiskを使っているが、GPTでフォーマットされたパーティションを利用する場合はgdiskコマンドを利用すること。 デバイス一覧表示 fdisk -l 特定デバイスの詳細表示 fdisk -l /dev/sda 特定デバイスのパーティション作成 fdisk /dev/sda パーティション作成後にカーネルにパーティションテーブルを認識させる リブートするか、 sudo partprobe /dev/sdc これをしないと、次のファイルシステムを作れない。 ファイルシステム作成 パーティションを作ってもファイルシステムを作らないとOSはディスクにファイルを保存できない。 よって、ファイルシステムを作る。 sudo mkfs.ext4 /dev/sdc1 これは結構大事なポイントです。 ちなみに、ここでext4ではなく、xfsを作りたい場合は次のようにします。 sudo mkfs.xfs /dev/sdc1 って感じですね。 ちなみにこのmkfsで作れるのは、linuxにデフォルトでインストールされているファイルシステムのみです。 例えば、vfatとか、minixとか、ext4とかですね。分散ファイルシステムであるlustreとか、 広域分散ファイルシステムのchfsとか (つくばの建部先生が作ったやつですね) をインストールしたい場合は、まったく別のアプローチをとる必要があることを承知してください。よろしくお願いします。 ちなみにちなみに、上のでxfsを作ったときの出力結果をこちらに置いておきます。 meta-data=/dev/sdb2 isize=512 agcount=4, agsize=54985734 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 data = bsize=4096 blocks=219942934, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=107394, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 osのファイルシステムへのマウント sudo mount /dev/sdc1 /mnt/disk1 とかでマウントされる。 ...

August 12, 2022 · 1 min · 176 words · Me

データベース実体の保存先の変更

ことはじめ データベースを使ったアプリを作ろうとしているのだが、rootディレクトリ以下がマウントされているSSDの容量が圧迫されており、データベースの実体の保存先を外部HHDに移さないといけなくなった。ので、備忘録もかねて移し方を解説していく。 データベースの実体 Mysqlで管理されているデータベースの実体は結局はファイルである。そのファイルをどこに置くのかは /etc/mysql/mysql.conf.d/ 以下のファイルで定義されている。デフォルトでは /var/lib/mysql がmysqlのデータベースの実体が置かれる場所となる。 データベースの実体の保存場所の変更 データベースの実体の保存場所をhddに移動させる方法を解説する。新しくdbの実体を保存するhddを、 /dev/sda1 とする。なお、hddをファイルシステムに認識させるには、パーティションを作成し、その上にファイルシステムを作らないといけない。これについては別の記事を参照すること。 多くの参考サイトは以下のコマンドを打つだけでHDDにデータの保存先を変更できると書いてある。 sudo mount /dev/sda1 /var/lib/mysql しかし、これは間違いである。実際は、/var/lib/mysqlのすべての内容を一度/dev/sda1にコピーする必要がある。 なぜなら、/var/lib/mysql以下にはmysqlが動作するために必要なモジュールやファイル一式が格納されているからである。 よって、まず初めに、mysqlデーモンを停止する。そして適当なポイント(e.g., /mnt/mnt_db/)に/dev/sda1をマウントし、/var/lib/mysqlをまるっと持ってくる。 sudo systemctl stop mysql.servive sudo mount /dev/sda1 /mnt/mnt_db cp -rp /var/lib/mysql/* /mnt/mnt_db ここまで来て初めて、 sudo mount /dev/sda1 /var/lib/mysql でマウントする。 sudo systemctl start mysql.service で再起動すれば問題なくできるはずである。 mysqlにログインしてデータベース作成、ユーザに権限を与え、外部アクセスを可能にするまで 外からデータベースにアクセスする方法。意外と手間取ったから、軽く流れを書いておく。 まずはローカルで、rootでmariadbにアクセス create database name identified by 'password'; でデータベースを作る。その後、外部アクセス用のユーザを作る。 作り方は、 create user user_name; そして、先ほど作ったデータベースの権限を今作ったユーザに与える。 こんな感じで。 そのあと、やることとしては、データベース用のポート解放(3306)。あと設定ファイルの変更 /etc/mysql/conf でbind=127.0.0.1が設定されていると特定のアドレスからしかアクセス出来なくなるのでコメントアウトすること。 しかし実際に運用するときはセキュリティを高めるために通信を許可するアドレスを設定したほうがいい。 その他、mysqlで忘れがちなこと localhostでのログイン方法 ルートでログインする際: sudo mysql -u root -p ...

August 12, 2022 · 1 min · 102 words · Me