同時実行制御のために数十万の0バイトロックファイルを作成する必要がある状況があります。
私は以下を使用してそれらを作成することをテストしました:
for i in `seq 1 50000`; do touch "/run/lock/${i}.lock"; done
ファイルは0バイトであるため、パーティション内のスペースを増やすことはありません。 df -h
を見てください:
Filesystem Size Used Avail Use% Mounted on
tmpfs 50M 344K 49M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 246M 0 246M 0% /run/shm
none 100M 0 100M 0% /run/user
0%
の数字は、/run/lock
行ではまったく変化しません。
ただし、メモリサイズは、ロックファイルあたり平均約1KB増加します。これは、free -h
内に70,000個のロックファイルを作成する前後の/run/lock
を比較することで発見しました。このメモリの増加は、実際のメモリ使用量(仮想メモリからバッファ/キャッシュを差し引いたもの)に反映されました。
後で私は、この1KBの増加はiノードが原因である可能性が最も高いことを発見しました。そこで、df -i
を使用してiノードの使用状況を確認しました。
Filesystem Inodes IUsed IFree IUse% Mounted on
tmpfs 62729 322 62407 1% /run
none 62729 50001 12728 80% /run/lock
none 62729 1 62728 1% /run/shm
none 62729 2 62727 1% /run/user
ご覧のとおり、ロックファイルは/run/lock
パーティション内のiノードを増やします。
私は現在Ubuntuを使用していますが、/run
マウントは/etc/fstab
内に反映されていません。 mount
を実行すると、次のようになります。
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
これに関していくつか質問があります(ただし、最初の質問が最も重要です)。
/run/lock
のiノード制限を永続的に増やすにはどうすればよいですか?この制限が再起動後も存続するように?/run/lock
を使用する代わりに、独自のディレクトリを作成し、それにtmpfsをマウントして、これに使用する方がよいでしょうか。/run
に保存しても、/run/lock
には影響しないようです。その逆も同様です。/run
のファイルシステムタイプがtmpfs
であるのに、/run/lock
、/run/shm
、/run/user
のファイルシステムタイプが「none」であるのはなぜですか。 TMPFSに支えられていますか? tmpfs
列ですべてがFilesystem
として読み取られないのはなぜですか?あなたの質問のいくつかに、順番に答えます:
mount -o remount,nr_inodes=NUM /run/lock
を使用できます(uid = 0で実行されている場合)。 / etc/fstabに関連する行を追加しても安全ですが、テストされていません。アプリケーションが空のファイルを開いて作成するかどうか(およびその期間)はわかりませんが、枯渇を避けるために、開いているファイルの制限を増やすことを検討することもできます(チェックlimit)。
あなたはこれについて間違った方向に進んでいます。ファイルシステムのセマンティクスを使用して、一貫性を強制できます。
ファイルを読みたいときは、開いて読んでください。 常にこの操作にはopen
を使用し、決してaccess
を使用しないでください。 PHPライブラリを使用してこれを行う場合は、ファイルでopen
ではなくaccess
を呼び出すだけであることを確認してください。ただし、fopen
は正常に機能するはずです。
新しいファイルを更新または作成する場合は、次の操作を実行します。-
名前の変更はアトミックに定義されているため、これは操作上安全です。ファイルを開くリーダーには、古いファイルまたは新しいファイルのいずれかが表示されますが、キャッシュ内に存在しないファイルは表示されません。
各ファイルの同時チェックが多数ある最悪の場合、多数のライターが互いに簡単に上書きします。しかし、これは方法です-各ファイルに対してファイルロックを使用するよりもはるかに安価です。
または、ファイルごとにロックファイルを用意するのではなく、実際には個々のキャッシュオブジェクトを直接ロックすることを検討してください。しかし、私はまだこれが拡大縮小するとは思いません。
この場合、rename
およびlink
セマンティクスを使用すると、キャッシュとの整合性が保証され、ファイルをロックするよりもはるかに安価に管理できます。