計算せずにディレクトリ内のファイル数を確認するには?

計算せずにディレクトリ内のファイル数を確認するには?

トラフィックの多いWebサーバーに深刻な問題があります。 PHPページの速度が著しく遅くなり、これはデータベース内のテーブルを参照するページまたはアクセスセッションでのみ発生する問題のようです。 「/var/log/messages」ログファイルには、次のエラーが数十万個表示されます。 "Kernel: EXT4-fs warning (device dm-0): ext4_dx_add_entry: ディレクトリインデックスがいっぱいです!"

Filezillaでフォルダを開くことができず、grepを使用してファイル/サブディレクトリの数を計算できないため、 '/var/lib/php/sessions'にボトルネックがあるようです。これはハードドライブの破損の可能性が高いですが、まずそのディレクトリ内のファイル数を確認して直感を確認したかったのです。

フォルダ内のファイル数を実際に数えることなく、フォルダ内のファイル数をどのように知ることができますか?

ベストアンサー1

ディレクトリのサイズ(図を参照ls -ld /var/lib/php/sessions)で確認できます。ファイルが小さい場合、ファイルはあまりありません。大きい場合はアイテムが多いかもしれませんし、過去にアイテムが多かったかもしれません。

ファイルを個別にリストしない限りstat、コンテンツのリストは同じサイズのファイルを読み取るよりも時間がかかりません。

lsおそらく何が起こっているのかdosまたはエイリアスがls -Fあるということですls --color。これらのオプションを使用すると、lstat各ファイルに対してシステムコールが発生し、そのファイルがファイルかディレクトリであるかを確認します。

また、ドットファイルをリストし、ファイルリストをソートされていないままにする必要があります。これを行うには、次を実行します。

command ls -f /var/lib/php/sessions | wc -l

改行文字を含むファイル名が多すぎない場合は、良い見積もりを得ることができます。

$ ls -lhd 1
drwxr-xr-x 2 chazelas chazelas 69M Aug 15 20:02 1/
$ time ls -f 1 | wc -l
3218992
ls -f 1  0.68s user 1.20s system 99% cpu 1.881 total
wc -l  0.00s user 0.18s system 9% cpu 1.880 total
$ time ls -F 1 | wc -l
<still running...>

の出力に使用されているinodeの数から、ファイルシステムの他の場所にある固有のファイルの数を減算して、そのファイルの数を推測することもできますdf -i

たとえば、ファイルシステムが/varGNUにマウントされている場合find

find /var -xdev -path /var/lib/php/sessions -prune -o \
  -printf '%i\n' | sort -u | wc -l

/var/lib/php/sessionsにないファイルの数を見つけます。IUsed出力のフィールドからそれを引くと、他の場所ではdf -i /var接続されていません(一部の特別なinodeは通常のextファイルシステムのどのディレクトリにも接続されていないため)、リンクファイルの数のおおよその値を得ることができます/var/lib/php/sessions(注/ var / lib / php / sessionsには、同じファイルに対して10億のエントリが含まれる可能性が高くなります(実際には、ファイル内の最大リンク数はほとんどのファイルシステムよりはるかに低いです)。

ディレクトリの内容を読み取る速度が比較的速くなければならない場合は、ファイルの削除が非常に遅くなる可能性があります。

rm -r、ファイルを削除するときは、まずディレクトリの内容を一覧表示し、各ファイルをunlink()呼び出します。各ファイルに対して、システムはこの巨大なディレクトリでファイルを見つける必要がありますが、ハッシュしないと非常に費用がかかります。

おすすめ記事