このトピックでは、ossfs の使用時によくある問題と解決策について説明します。問題が発生した場合は、まず ossfs のバージョンを確認してください。1.80.x などの古いバージョンを使用している場合は、最新バージョンへのアップグレードを推奨します。新しいバージョンでは、新機能が追加され、安定性も向上しています。
概要
各 ossfs エラーにはメッセージが含まれています。ソケット接続の失敗や HTTP 4xx/5xx ステータスコードなどの問題をトラブルシューティングするには、これらのメッセージを収集して原因を特定してください。開始する前にデバッグログを有効にしてください。
-
403 エラーは、権限不足によりリクエストが拒否されたことを示します。
-
400 エラーは、ユーザーの操作が正しくないことを示します。
-
5xx エラーは、通常、ネットワークの不安定さまたはクライアント側の問題に関連しています。
ossfs の主な特性:
-
ossfs はリモートの OSS バケットをローカルディスクとしてマウントします。ワークロードがファイル I/O パフォーマンスに敏感な場合は、ossfs の使用を推奨しません。
-
ossfs の操作は原子性を保証しません。ローカル操作が成功しても、対応するリモート OSS 操作が失敗する可能性があります。
ossfs がビジネス要件を満たさない場合は、ossutil を使用してください。
権限の問題
Dec 22 17:21:22 rerpdb1601 s3fs[21838]: [tid-21839][INF] curl.cpp:PutHeadRequest(2278): [tpath=/.fuse_hidden0000002700000006]
Dec 22 17:21:22 rerpdb1601 s3fs[21838]: [tid-21839][INF] curl.cpp:prepare_url(4030): URL is http://oss-cn-hangzhou-internal.aliyuncs.com/pgback/.fuse_hidden0000002700000006
Dec 22 17:21:22 rerpdb1601 s3fs[21838]: [tid-21839][INF] curl.cpp:prepare_url(4062): URL changed is http://pgback.oss-cn-hangzhou-internal.aliyuncs.com/.fuse_hidden0000002700000006
Dec 22 17:21:22 rerpdb1601 s3fs[21838]: [tid-21839][INF] curl.cpp:PutHeadRequest(2330): ...fuse_hidden0000002700000001
Dec 22 17:21:22 rerpdb1601 s3fs[21838]: [tid-21840][INF] curl.cpp:RequestPerform(63...): HTTP response code 403 was returned, returning EPERM
Dec 22 17:21:22 rerpdb1601 s3fs[21838]: [tid-21840][INF] s3fs:s3fs_flush(2127): [path=/tmp/7kAcr][fd=6]
Dec 22 17:21:22 rerpdb1601 s3fs[21838]: [tid-21840][INF] fdcache.cpp:RowFlush(1302): [path]=[path=/tmp/7kAcr][fd=6]
Dec 22 17:21:22 rerpdb1601 s3fs[21838]: [tid-21845][INF] s3fs:s3fs_release(2185): [path=/tmp/7kAcr][fd=6]
ファイルを touch する際の 403 エラー
原因:403 エラーは通常、権限の問題によって発生します。次のような場合に touch コマンドを実行すると、403 エラーが返ることがあります。
-
ファイルがアーカイブストレージ オブジェクトである場合。このタイプのオブジェクトを touch すると、403 エラーが返ります。
-
使用している AccessKey にバケットでの操作を実行する権限がない場合。
解決策:
-
アーカイブストレージ オブジェクトの場合:アクセスする前にオブジェクトを復元するか、バケットでアーカイブストレージ オブジェクトのリアルタイムアクセスを有効にしてください。
-
権限エラーの場合:AccessKey を所有するアカウントに必要な権限を付与してください。
rm コマンドエラー:Operation not permitted
原因:rm コマンドは DeleteObject API を呼び出します。RAM ユーザーとしてバケットをマウントした場合は、RAM ユーザーにオブジェクトを削除する権限があることを確認してください。
解決策:RAM ユーザーに必要な権限を付与してください。詳細については、「RAM ポリシーの概要」および「RAM ポリシーの一般的な例」をご参照ください。
エラー:Invalid endpoint
原因:このエラーは、エンドポイントが正しく指定されていないことを示します。次のような理由が考えられます。
-
バケットとエンドポイントが一致していない場合。
-
バケット所有者の UID が AccessKey に関連付けられた UID と一致していない場合。
解決策:設定を確認して修正してください。
マウントの問題
カスタムドメイン名のサポート
いいえ、ossfs はカスタムドメイン名でのマウントをサポートしていません。
CentOS 7.x での HTTPS マウントの失敗
解決策:
-
バケットをマウントする際に
-ocurldbgオプションを追加し、ログにNSS error -8023 (SEC_ERROR_PKCS11_DEVICE_ERROR)が含まれているかどうかを確認してください。 -
ログにこのエラーが記録されている場合は、ローカルにインストールされている NSS バージョンを確認してください。
NSS バージョンが 3.36 の場合は、
yum update nssコマンドを実行して NSS を更新してから、バケットのマウントを再試行してください。
ECS RAM ロールでのマウントの失敗
解決策:
-
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/[your-ecs-ram-role]コマンドを実行して、接続性を確認してください。 -
curl コマンドが成功した場合は、バケットをマウントする際に
-o disable_imdsv2オプションを追加してください。
マウントエラー:Transport endpoint is not connected
原因:指定されたディレクトリが存在しません。
解決策:ディレクトリを作成してから、マウント操作を実行してください。
マウントエラー:Permission denied
原因:これは FUSE のバグです。FUSE では、現在のユーザーが現在の作業ディレクトリ (マウントポイントではない) に対する読み取り権限を持つ必要があります。
解決策:cd コマンドを使用して読み取り権限のあるディレクトリに移動してから、ossfs コマンドを実行してください。
マウントエラー:Mountpoint is not empty
原因:デフォルトでは、ossfs は空のディレクトリにのみマウントできます。このエラーは、空でないディレクトリに ossfs をマウントしようとしたときに発生します。
解決策:空のディレクトリに移動して再度マウントしてください。このディレクトリにマウントする必要がある場合は、マウント時に -ononempty パラメータを追加してください。
マウントタイムアウトエラー
原因:ossfs マウントリクエストがタイムアウトしました。
解決策:ossfs は readwrite_timeout オプションを使用して、読み取りおよび書き込みリクエストのタイムアウト時間を秒単位で設定します。デフォルト値は 60 です。ワークロードに基づいてこの値を増やしてください。
マウントエラー:Incorrect credential file permissions
原因:/etc/passwd-ossfs ファイルの権限が正しくありません。
解決策:/etc/passwd-ossfs ファイルには認証情報が格納されているため、他のユーザーのアクセスを制限する必要があります。chmod 640 /etc/passwd-ossfs コマンドを実行してファイルの権限を変更してください。
ls エラー:Operation not permitted
原因:バケットに不可視文字を含む名前のオブジェクトが含まれているかどうかを確認してください。ファイルシステムはファイル名とディレクトリ名に厳格な制限を適用するため、このエラーが発生することがあります。
解決策:別のツールを使用してこれらのオブジェクトの名前を変更してください。その後、ls コマンドでディレクトリの内容を正しくリストできます。
マウントエラー:FUSE device not found
原因:このエラーは通常、Docker コンテナ内で発生します。これは、コンテナが FUSE カーネルモジュールへのアクセスまたはロードの権限がないためです。
解決策:Docker コンテナで実行する場合は、--privileged=true パラメータを追加してコンテナに特権を付与できます。これにより、コンテナ内のプロセスは、FUSE ファイルシステムの使用など、ホストマシンと同様の操作を実行できます。次に、--privileged フラグを使用してコンテナを起動するコマンドの例を示します。
docker run --privileged=true -d your_image
マウントエラー:libcrypto.so.1.1 not found
原因:インストールパッケージのバージョンがオペレーティングシステムのバージョンと一致していません。
解決策:この問題を解決するには、オペレーティングシステムに一致するインストールパッケージをダウンロードしてください。
課金
バックグラウンドファイルスキャンによるコストの回避
原因:プログラムが ossfs でマウントされたディレクトリをスキャンすると、スキャンにより OSS へのリクエストが生成されます。リクエストレートが高くなると料金が発生することがあります。
解決策:auditd ツールを使用して、OSS にマウントされたディレクトリをスキャンするプロセスを特定します。次の手順を実行してください。
-
auditd をインストールして起動します。
sudo apt-get install auditd sudo service auditd start -
OSS マウントポイントを監視ディレクトリとして設定します。たとえば、マウントポイントが /mnt/ossfs の場合は、次のコマンドを実行します。
auditctl -w /mnt/ossfs -
監査ログを確認して、どのプロセスがディレクトリにアクセスしたかを確認します。
ausearch -i | grep /mnt/ossfs -
マウントポイントのスキャンをスキップするようにプロセスを設定します。
たとえば、updatedb がマウントされたディレクトリをスキャンしていることがログで確認された場合は、/etc/updatedb.conf ファイルを変更して除外してください。これを行うには、次の手順を実行してください。
-
PRUNEFS =パラメータにfuse.ossfsを追加してください。 -
PRUNEPATHS =パラメータにマウントポイントを追加してください。
-
ディスクとメモリの問題
Nov 8 02:58:28 izw9e9xgcy43hdoultcoez kernel: [30273] 0 30273 33017 827 61 0 AliYunDun
Nov 8 02:58:28 izw9e9xgcy43hdoultcoez kernel: [16398] 0 16398 1301998 317459 955 0 java
Nov 8 02:58:28 izw9e9xgcy43hdoultcoez kernel: Out of memory: Kill process 3017 (ossfs) score 58 or sacrifice child
Nov 8 02:58:28 izw9e9xgcy43hdoultcoez kernel: Killed process 3017 (ossfs) total-vm:3840372kB, anon-rss:4787892kB, file-rss:208kB, shmem-rss:0kB
Nov 8 02:58:45 izw9e9xgcy43hdoultcoez s3fs s3fs[2968]: s3fs.cpp:list_bucket(2382): list_bucket returns error(-1).
Nov 8 02:58:45 izw9e9xgcy43hdoultcoez s3fs s3fs[2968]: s3fs.cpp:list_bucket(2459): xmlReadMemory with error...
Nov 8 02:58:45 izw9e9xgcy43hdoultcoez s3fs s3fs[2968]: s3fs.cpp:list_bucket(2382): list_bucket returns error(-1).
Nov 8 02:58:47 izw9e9xgcy43hdoultcoez systemd: Started Session 4614 of user root.
ossfs が断続的に切断される
原因:
-
デバッグログでメモリ不足 (OOM) エラーを確認してください。これを行うには、-d -odbglevel=dbg パラメータを追加してデバッグログを有効にします。ossfs はデフォルトのシステムログファイルにログを書き込みます。
-
CentOS システムでは、ログは
/var/log/messagesに書き込まれます。 -
Ubuntu システムでは、ログは
/var/log/syslogに書き込まれます。
-
-
ログを確認すると、listbucket および listobject 操作中にメモリ使用量が増加し、システムの OOM キラーが ossfs プロセスを終了させたことがわかる場合があります。
説明listobject 操作は、オブジェクトメタデータを取得するために OSS に HTTP リクエストを送信します。多数のオブジェクトがある場合、
lsコマンドはメタデータを取得するために大量のシステムメモリを消費する可能性があります。
解決策:
-
-omax_stat_cache_size=xxx パラメータを使用して stat キャッシュサイズを増やしてください。最初の
ls操作は遅くなりますが、メタデータがローカルにキャッシュされるため、その後の呼び出しは高速になります。デフォルト値は 1,000 で、約 4 MB のメモリを消費します。マシンの利用可能なメモリに基づいてこの値を調整してください。 -
読み取りおよび書き込み操作中、ossfs は Nginx と同様に、大量の一時キャッシュデータをディスクに書き込むことがあります。これにより、利用可能なディスク容量が枯渇することがあります。ossfs は終了時に一時ファイルを自動的にクリーンアップします。
-
ossfs の代わりに ossutil を使用してください。ossfs は本番環境以外のワークロードに使用できます。高い信頼性と安定性を必要とするサービスの場合は、ossutil の使用を推奨します。
ossfs がディスク容量を使い果たす理由
原因:パフォーマンスを向上させるため、ossfs はデフォルトで、一時的なアップロードおよびダウンロードデータを保存するために、できるだけ多くのディスク容量を使用します。これにより、利用可能なディスク容量が枯渇することがあります。
解決策:-oensure_diskfree オプションを使用してディスク容量を予約してください。たとえば、20 GB のディスク容量を予約するには、次のコマンドを実行してください。
ossfs examplebucket /tmp/ossfs -o url=http://oss-cn-hangzhou.aliyuncs.com -oensure_diskfree=20480
df コマンドで 256 TB のディスクサイズが表示される
df コマンドで表示されるディスクサイズは表示目的のみであり、実際のバケット容量を表すものではありません。Size (総ディスク容量) と Avail (利用可能なディスク容量) の値は 256 TB に固定されており、Used (使用済みディスク容量) の値は 0 TB に固定されています。
OSS は無制限のバケット容量を提供します。ストレージ使用量は実際の使用状況によって異なります。バケット使用量の照会方法の詳細については、「バケットレベルの使用量の照会」をご参照ください。
[root@rjhdadmin xxx]# du -sh *
24G caohh.zip
[root@rjhdadmin lixiao]# cp caohh.zip /data/ossfs/xxx
cp: writing '/data/ossfs/xxx/caohh.zip': Input/output error
cp: closing '/data/ossfs/xxx.zip': Input/output error
[root@rjhdadmin xxx]#
cp コマンド:Input/output error
原因:このエラーは、ディスク I/O の問題を示しています。エラーが発生したときにディスクの読み取り/書き込み負荷が高いかどうかを確認してください。
解決策:ファイルの読み取りおよび書き込み操作を制御するために、パート関連のパラメータを追加してください。ossfs -h コマンドを実行して、利用可能なパート関連のパラメータを表示してください。
cp: writing '/data/tmp/I_201704/12/request.1491926430217.avro': Input/output error
cp: closing '/data/tmp/I_201704/12/request.1491926430217.avro': Input/output error
大きなファイルのコピー時の I/O エラー
原因:ossfs を rsync と一緒に使用すると問題が発生することがあります。この場合、ユーザーは 141 GB のファイルに対して cp コマンドを実行しましたが、これによりディスクに非常に高い負荷がかかり、このエラーが発生しました。
解決策:OSS から ECS インスタンスにファイルをダウンロードする、または ECS インスタンスから OSS にファイルをアップロードするには、ossutil のマルチパートアップロードおよびダウンロード機能を使用してください。
[root@c653a8832c9eb4d8d9xxx xxx a-node5 ~]# ossfs xxx xxx xxx /xxx/daily -o multipart_size=31457280 -ourl=http://oss-ap-southeast-3-internal.aliyuncs.com
ossfs: There is no enough disk space for used as cache(or temporary) directory by s3fs.
[root@c653a8832c9eb4d8d9xxx a-node5 ~]#
アップロードエラー:キャッシュ用のディスク容量が不足しています
-
原因
利用可能なディスク容量が
multipart_size * parallel_count未満です。multipart_size パラメータはパートサイズを指定します。デフォルトの単位は MB です。parallel_count パラメータは並列でアップロードするパートの数を指定します。デフォルト値は 5 です。
-
分析
デフォルトでは、ossfs はマルチパートアップロードを使用して大きなファイルをアップロードします。アップロード中、ossfs は一時キャッシュファイルを /tmp ディレクトリに書き込みます。データを書き込む前に、ossfs は /tmp ディレクトリを含むディスクの空き容量が
multipart_size * parallel_count未満かどうかを確認します。空き容量がmultipart_size * parallel_countを超える場合、書き込みは通常どおり続行されます。空き容量がmultipart_size * parallel_count未満の場合、ossfs はローカルディスク容量が不足していることを示すエラーを返します。たとえば、利用可能なディスク容量が 300 GB で、アップロードするファイルが 200 GB の場合、multipart_size が 100,000 (100 GB) に設定されており、parallel_count がデフォルト値の 5 のままである場合、ossfs は必要な容量を 100 GB × 5 = 500 GB と計算し、これはローカルの空き容量を超えます。
-
解決策
parallel_count がデフォルト値の 5 のままである場合は、multipart_size を適切な値に設定してください。
-
利用可能なディスク容量が 300 GB で、アップロードするファイルが 200 GB の場合は、multipart_size を 20 に設定してください。
-
利用可能なディスク容量が 300 GB で、アップロードするファイルが 500 GB の場合は、multipart_size を 50 に設定してください。
-
依存関係の問題
インストールエラー:FUSE library too old
原因:ossfs のコンパイルに使用された libfuse バージョンが、実行時にリンクされる libfuse バージョンよりも高くなっています。これは、libfuse を手動でインストールした場合によく発生します。CentOS 5.x および CentOS 6.x システムでは、Alibaba Cloud が提供する ossfs パッケージには libfuse-2.8.4 が含まれています。実行時環境に libfuse-2.8.3 が存在し、ossfs が古い FUSE バージョンにリンクすると、この警告が表示されます。
ldd $(which ossfs) | grep fuse コマンドを実行して、ossfs が実行時にリンクする FUSE バージョンを確認してください。結果が /lib64/libfuse.so.2 の場合は、ls -l /lib64/libfuse* コマンドを実行して FUSE バージョンを表示してください。
解決策:正しいバージョンにリンクするように ossfs を設定してください。
-
rpm -ql ossfs | grep fuse コマンドを実行して、libfuse ディレクトリを見つけてください。
-
結果が /usr/lib/libfuse.so.2 の場合は、LD_LIBRARY_PATH=/usr/lib ossfs … コマンドを使用して ossfs を実行してください。
Total size: 6.0 M
Installed size: 6.0 M
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Check Error:
file /sbin/mount.fuse from install of ossfs-1.80.3-1.x86_64 conflicts with file from package fuse-2.8.3-5.el6.x86_64
file /usr/bin/fusermount from install of ossfs-1.80.3-1.x86_64 conflicts with file from package fuse-2.8.3-5.el6.x86_64
file /usr/bin/ulockmgr_server from install of ossfs-1.80.3-1.x86_64 conflicts with file from package fuse-2.8.3-5.el6.x86_64
Error Summary
-------------
[root@localhost 123]# rpm -qa |grep fuse
fuse-2.8.3-5.el6.x86_64
fuse-ntfs-3g-2013.1.13-2.el6.rf.x86_64
You have new mail in /var/spool/mail/root
[root@localhost 123]#
FUSE 依存関係のインストールエラー
原因:FUSE バージョンが ossfs の要件を満たしていません。
解決策:yum を使用せずに、最新バージョンの FUSE を手動でダウンロードしてインストールしてください。詳細については、「fuse」をご参照ください。
ls エラー:Input/output error
原因:この問題は主に CentOS 環境で発生します。ログには NSS error -8023 エラーが表示されます。ossfs が HTTPS 通信に libcurl を使用する際に問題が発生します。これは、libcurl が依存する Network Security Services (NSS) ライブラリが古すぎることが原因と考えられます。
解決策:次のコマンドを実行して、NSS ライブラリを最新バージョンに更新してください。
yum update nss
インストールエラー:Conflicts with fuse-devel
原因:システムに古いバージョンの FUSE が存在し、ossfs の依存関係バージョンと競合しています。
解決策:パッケージマネージャーを使用して FUSE をアンインストールしてから、ossfs を再インストールしてください。
その他の問題
多数のファイルまたは高同時実行時の ossfs の遅さ
ossfs 1.0 は高同時実行シナリオには推奨されません。これらのシナリオで使用する必要がある場合は、次のオプションを検討してください。
-
オプション 1:ossfs 2.0 を使用してバケットをマウントします。ossfs 1.0 と比較して、ossfs 2.0 では順次読み取りおよび書き込み操作と小さなファイルの同時読み取りにおいてパフォーマンスが大幅に向上します。詳細については、「パフォーマンスの向上」をご参照ください。
-
オプション 2:より優れたパフォーマンスを得るために、Cloud Storage Gateway を使用して OSS バケットをマウントしてください。ossfs 1.0 のパフォーマンスは、高同時実行ワークロードや大きなファイルのアップロードおよびダウンロードには適していません。小さなファイルに対する日常的な操作に最適です。
アップロードされたファイルの Content-Type が正しくない
原因:ファイルをアップロードする際、ossfs は /etc/mime.types ファイルを読み取って Content-Type を設定します。このファイルが存在しない場合、ossfs はデフォルトで application/octet-stream を使用します。
解決策:このファイルが存在するかどうかを確認してください。存在しない場合は、追加してください。
-
コマンドによる mime.types ファイルの自動追加
-
Ubuntu システムの場合:
sudo apt-get install mime-support コマンドを実行してください。
-
CentOS システムの場合:
sudo yum install mailcap コマンドを実行してください。
-
-
mime.types ファイルの手動追加
-
mime.types ファイルを作成します。
vi /etc/mime.types -
必要な形式を 1 行に 1 つずつ追加してください。
application/javascript jsの形式を使用してください。
-
ファイルを追加した後、OSS バケットを再マウントする必要があります。
フォルダーがファイルとして識別される
-
シナリオ 1
原因:フォルダーオブジェクト (名前がスラッシュ (
/) で終わるオブジェクト) を作成し、その Content-Type を text/plain に設定すると、ossfs はそのオブジェクトをファイルとして識別します。解決策:マウント時に
-ocomplement_statパラメータを追加できます。フォルダーオブジェクトのサイズが 0 または 1 の場合、ossfs はそれをフォルダーとして認識します。 -
シナリオ 2
原因:
ossutil statコマンドを実行します。ここで、<folder-object>はスラッシュ (/) で終わるオブジェクト名です。たとえば、ossutil stat oss://[bucket]/folder/です。コマンドの実行後、次のフィールドを確認してください。-
オブジェクトサイズを示す Content-Length フィールドを確認してください。オブジェクトサイズが 0 でない場合、オブジェクトはファイルとして識別されます。
解決策:このフォルダーオブジェクトの内容が不要になった場合は、
ossutil rm oss://[bucket]/folder/コマンドを実行してオブジェクトを削除してください。この操作はフォルダー内のファイルには影響しません。または、ossutil を使用してゼロバイトのオブジェクトを同じ名前でアップロードして、フォルダーオブジェクトを上書きすることもできます。 -
オブジェクトサイズが 0 の場合は、Content-Type フィールドを確認してください。このフィールドの値が
application/x-directory、httpd/unix-directory、binary/octet-stream、またはapplication/octet-streamでない場合、オブジェクトもファイルとして識別されます。解決策:
ossutil rm oss://[bucket]/folder/コマンドを実行してオブジェクトを削除してください。この操作はフォルダー内のファイルには影響しません。
-
mv 操作の失敗
原因:ソースファイルがアーカイブストレージ、コールドアーカイブストレージ、またはディープコールドアーカイブストレージオブジェクトの場合、ossfs の mv 操作は失敗することがあります。
解決策:mv 操作を実行する前に、オブジェクトを復元する必要があります。詳細については、「オブジェクトの復元」をご参照ください。
Windows サポート
いいえ。Windows では、Rclone を使用してバケットをマウントできます。詳細については、「Rclone」をご参照ください。
複数の Linux サーバーへのマウント
はい。複数の Linux ECS サーバーにマウントできます。詳細については、「バケットのマウント」をご参照ください。
ツール間でファイル情報が一致しない
原因:デフォルトでは、ossfs はパフォーマンスを向上させるために、ファイルサイズや権限などのファイルメタデータをキャッシュします。これにより、ls コマンドを実行するたびに OSS にリクエストを送信することを回避できます。SDK、OSS コンソール、ossutil などの他のツールを使用してファイルを変更した場合、ossfs がキャッシュを適時に更新しないことがあるため、データの不整合が発生する可能性があります。
解決策:バケットをマウントする際に -omax_stat_cache_size=0 パラメータを追加して、メタデータキャッシングを無効にしてください。ls コマンドが実行されるたびに、最新のファイル情報を取得するために OSS にリクエストが送信されます。
バージョン管理を有効にした後のマウントの遅さ
原因:デフォルトでは、ossfs は ListObjects (GetBucket) 操作を使用してファイルをリストします。バージョン管理が有効になっていて、バケットにオブジェクトの 1 つ以上の履歴バージョンと多数の期限切れ削除マーカーが含まれている場合、ListObjects (GetBucket) を使用して現在のオブジェクトをリストすると遅くなることがあり、マウントパフォーマンスの低下につながります。
解決策:-olistobjectsV2 オプションを追加して、ossfs がリスト取得に ListObjectsV2 (GetBucketV2) を使用するよう切り替えてください。
HTTPS でのマウント
ossfs は HTTPS でのマウントをサポートしています。次に、中国 (杭州) リージョンのサンプルコマンドを示します。
ossfs examplebucket /tmp/ossfs -o url=https://oss-cn-hangzhou.aliyuncs.com
大きなディレクトリでの ls コマンドの遅さ
原因:ディレクトリに N 個のファイルが含まれている場合、その内容をリストするには少なくとも N 個の OSS HTTP リクエストが必要です。N が大きい場合、これは深刻なパフォーマンス問題を引き起こす可能性があります。
解決策:-omax_stat_cache_size=xxx パラメータを使用して stat キャッシュサイズを増やしてください。最初の ls 操作は遅くなりますが、メタデータがローカルにキャッシュされるため、その後の呼び出しは高速になります。ossfs 1.91.1 より前では、このパラメータのデフォルト値は 1,000 です。ossfs 1.91.1 以降では、デフォルト値は 100,000 で、数十メガバイトのメモリを消費します。マシンの利用可能なメモリに基づいてこの値を調整してください。
アンマウントエラー:Device or resource busy
原因:プロセスがマウントポイント /mnt/ossfs-bucket 配下のファイルにアクセスしているため、ディレクトリをアンマウントできません。
解決策:
-
lsof /mnt/ossfs-bucketコマンドを実行して、ディレクトリを使用しているプロセスを見つけてください。 -
killコマンドを使用してプロセスを終了してください。 -
fusermount -u /mnt/ossfs-bucketコマンドを実行してバケットをアンマウントしてください。
ossfs 1.0 での大量の 404 ログ
背景情報:ossfs 1.0 を使用すると、ログに 404 Not Found レコードが表示されることがよくあります。ほとんどの場合、これはシステムエラーではありません。これは ossfs 1.0 がローカルファイルシステムをシミュレートするための想定内の動作です。
ファイルを操作する前に、オペレーティングシステムはターゲットオブジェクトが存在するかどうかを確認します。このプロセスにより、OSS への多数のプローブリクエストがトリガーされることがあります。オブジェクトが存在しない場合、OSS は 404 ステータスコードを返します。
次の手順では、ossfs 1.0 がオブジェクトが存在するかどうかを確認する方法について説明します。
-
ossfs は HeadObject リクエストを送信して、
objectなどの指定されたパスが実際のオブジェクトとして存在するかどうかを確認します。オブジェクトが存在する場合、システムはオブジェクトメタデータを返します。オブジェクトが存在しない場合、システムは 404 エラーを返し、次のステップに進みます。
-
404 エラーを受信した後、ossfs は HeadObject リクエストを送信して、
object/オブジェクトが存在するかどうかを確認します。オブジェクトが存在する場合、システムはオブジェクトメタデータを返します。オブジェクトが存在しない場合、システムは 404 エラーを返し、次のステップに進みます。
-
404 エラーを受信した後、ossfs は HeadObject リクエストを送信して、
object_$folder$オブジェクトが存在するかどうかを確認します。オブジェクトが存在する場合、システムはオブジェクトメタデータを返します。オブジェクトが存在しない場合、システムは 404 エラーを返し、次のステップに進みます。
-
404 エラーを受信した後、ossfs は ListObjects リクエストを送信して、プレフィックス
object/を持つオブジェクトをリストすることにより、指定されたパスがディレクトリであるかどうかを判断します。結果が空の場合、パスは存在しません。結果が空でない場合、ディレクトリは存在し、システムはディレクトリの内容をリストします。
原因:
-
statなどのコマンドを使用して存在しないファイルにアクセスすると、OSS は 404 エラーを返します。これはローカルファイルシステムエラー「No such file or directory」にマッピングされます。 -
ファイルまたはディレクトリを一括で作成する前に、オペレーティングシステムはターゲットが存在するかどうかを確認し、存在しない場合にのみ作成リクエストを送信します。このチェック中に生成される 404 エラーは想定内の動作であり、システムの問題ではありません。
解決策:404 エラーは想定内の動作を示していますが、頻繁なプローブリクエストは高同時実行または一括操作シナリオでパフォーマンスに影響を与える可能性があります。次のオプションを使用してパフォーマンスを最適化できます。
これらのオプションを設定した後、ossfs 1.0 はローカルキャッシュが期限切れになるまで、OSS で行われたオブジェクトへの変更を検出できません。
-
-o stat_cache_expireおよび-o max_stat_cache_sizeの値を増やして、メタデータキャッシュの期間を延長し、キャッシュエントリの数を増やしてください。メタデータが期限切れになる前にファイルまたはディレクトリを照会すると、ossfs は OSS への繰り返しリクエストの送信を回避します。
-
-o stat_cache_expire:メタデータキャッシュの有効期限を指定します。デフォルト値は 900 秒です。 -
-o max_stat_cache_size:メタデータキャッシュ内のエントリ数を指定します。デフォルト値は 100,000 です。
-
-
ossfs 1.91.6 より前のバージョンを使用している場合は、
-o enable_noobj_cacheオプションを使用してネガティブキャッシュを有効にしてください。ossfs 1.91.6 以降では、ネガティブキャッシュがデフォルトで有効になっています。ファイルが最初に照会され、存在しない場合、ossfs は結果をメモリにキャッシュします。キャッシュが期限切れになる前に、後続の問い合わせでは OSS にリクエストを送信する代わりにローカルネガティブキャッシュを使用します。
説明ossfs 1.0 では、ファイルネガティブキャッシュはメタデータキャッシュの一部です。
-o stat_cache_expireパラメータを使用して有効期限を制御し、-o max_stat_cache_sizeパラメータを使用してキャッシュエントリの最大数を制御できます。