トラフィックの多いWebサーバーでかなり深刻な問題が発生しています。 PHPページの速度が大幅に低下しており、セッションにアクセスするページ、またはデータベース内の特定のテーブルが参照されているページでのみ問題が発生しているようです。 '/ var/log/messages 'ログファイル、次のエラーが数十万件表示されます:'カーネル:EXT4-fs警告(デバイスdm-0):ext4_dx_add_entry:ディレクトリインデックスがいっぱいです! '
Filezillaでフォルダを開くことができず、grepでファイル/サブディレクトリの数を数えることができないため、「/ var/lib/php/sessions」にボトルネックがあると思われます。ハードドライブが破損している可能性が高いですが、最初にこのディレクトリ内のファイルの数を確認して、私の勘を確認したいと思います。
フォルダ内のファイルを実際に数えずに、フォルダ内のファイルの数を見つけるにはどうすればよいですか?
ディレクトリのサイズ(_ls -ld /var/lib/php/sessions
_で見られる)は、指標を与えることができます。小さい場合、ファイルは多くありません。大きい場合は、エントリが多いか、過去に多い可能性があります。
個々のファイルをstat
しない限り、コンテンツの一覧表示は、同じサイズのファイルを読み取るよりもはるかに長くかかることはありません。
_ls -F
_または_ls --color
_を実行するls
のエイリアスがある可能性があります。これらのオプションを使用すると、すべてのファイルに対して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...>
_
_df -i
_の出力で使用されているiノードの数からファイルシステムの他の場所にある一意のファイルの数を引くことによって、そこにあるファイルの数を推測することもできます。
たとえば、ファイルシステムが_/var
_にマウントされている場合、GNU find
:
_find /var -xdev -path /var/lib/php/sessions -Prune -o \
-printf '%i\n' | sort -u | wc -l
_
/ var/lib/php/sessionsにないファイルの数を見つけるため。これを_df -i /var
_の出力のIUsed
フィールドに差し引くと、数値の概算が得られます(一部の特別なiノードは通常のextファイルシステムのどのディレクトリにもリンクされていないため) _/var/lib/php/sessions
_にリンクされ、他の場所ではリンクされていないファイルの数(/ var/lib/php/sessionsには、同じファイルに対して10億のエントリが含まれる可能性があることに注意してください(実際には、ファイル上のリンクの最大数はほとんどのファイルシステムよりもはるかに低くなるため)、その方法は絶対確実ではありません)。
ディレクトリの内容の読み取りが比較的高速である必要がある場合、ファイルの削除は非常に遅くなる可能性があることに注意してください。
_rm -r
_は、ファイルを削除するときに、最初にディレクトリコンテンツを一覧表示し、次にすべてのファイルに対してunlink()
を呼び出します。また、すべてのファイルについて、システムはその巨大なディレクトリ内のファイルを検索する必要があります。ハッシュされていない場合、非常にコストがかかる可能性があります。
SSH経由で_ls -1 /var/lib/php/sessions | wc -l
_を使用できると思います
ls -(one)
およびws -(letter l)
であることに注意してください
Ext2/3/4では、ディレクトリ自体のサイズに基づいて概算を行うことができます。これはあまり正確ではありませんが、「数える」ことなく知識に基づいた推測が可能です。
ディレクトリはデフォルトで4096バイトから始まります。エントリが増えると、サイズが大きくなります(ただし、再び縮小することはありません)。いくつかのテストの結果、各エントリは12バイトを使用し、制限に達すると4096バイト増加するようです。これは、現在のディレクトリサイズが16384の場合、一度に1,024〜1,365のエントリがあることを意味します。
これらのディレクトリ内のファイルをすぐに表示するためのトリックもあります。 ls
を実行すると、ディレクトリ全体が読み取られてから並べ替えられます。 ls -1U
を使用して並べ替えを無効にできます。