問題タブ [fsync]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - SDカード書き込み性能
SDカードに一定の速度でjpeg画像を書き込む小さなアプリケーションを書いています。EXT3 ファイルシステムを選択しましたが、EXT2 ファイルシステムでも同じ動作が観察されました。
私の書き込みループは次のようになります。
またはこのように:
また、いくつかのタイミング統計を表示すると、プログラムが数秒間ブロックされていることがわかります。受信画像を fifo に保持すると、そのようなストールの後に短時間で多くの画像を書き込むため、平均レートはまだ良好です。OSの問題なのかSDカード自体の問題なのか分かりますか?どうすればリアルタイムに近づくことができますか? 強力なリアルタイムは必要ありませんが、数秒間停止することは受け入れられません。
ある程度の精度:はい、すべてのファイルの後にfsyncする必要があります。これは、イメージをユーザーまたはカーネルバッファーではなくディスクに配置したいためです。fsync を使用しないと、スルー出力が大幅に改善されますが、それでも許容できないほどのストールが発生します。最初のストールは 50M バイトが書き込まれた後に発生するため、バッファの問題ではないと思います。また、man ページによると、fsync は正確にここにあり、データがバッファリングされていないことを確認します。
平均書き込み速度に関する精度 : 使用しているカードで維持できる速度で書き込みを行っています。fsync が完了するのを待っている間に着信イメージをパイルすると、この失速後に書き込み転送速度が上昇し、すぐに平均速度に戻ります。平均転送速度は約 1.4 MBytes/s です。
システムは、ストックキー(2.6.24.19)を備えたubuntu 8.04を実行する最新のラップトップです
c++ - オフストリームで fsync を実行するには?
オフストリームがディスク デバイスに書き込まれていることを確認したいと考えています。これを行う移植可能な方法 (POSIX システムで移植可能) は何ですか?
読み取り専用open
追加モードでファイルを個別に取得してファイル記述子を取得し、それを呼び出すと、問題は解決しますか? このような:fsync
fflush - fflush と fsync の違い
fsync()
私はfflush()
内部的にそう思ったのでfsync()
、ストリームで使用しても問題ありません。しかし、ネットワーク I/O で実行すると予期しない結果が得られます。
私のコードスニペット:
しかし_commit()
、データをフラッシュしていないようです (私は Windows で試しましたが、データは Linux のエクスポートされたファイルシステムに書き込まれました)。
コードを次のように変更したとき:
データをフラッシュします。
_commit()
と同じことをするかどうか疑問に思っていfflush()
ます。入力はありますか?
file - ブロックせずに 2 つのファイルが順番にフラッシュされるようにする posix-way はありますか?
私のプログラムでは、2 つのファイルを書き込み用に開いたままにします。1 つはデータのチャンクを含むコンテンツ ファイルで、もう 1 つはデータのチャンクがこれまでに書き込まれたマップを含むインデックス ファイルです。
データファイル内のブロックがマップファイル内の対応するブロックの前に(自然に)書き込まれなければならないという唯一の制約付きで、可能な限りパフォーマンスを上げて両方をディスクにフラッシュしたいと思います。
問題は、遅延とスループットの両方の理由から、IE が fsync を実行するのをブロックすることを避けたいということです。
何か案は?
directory - POSIXでファイルの名前を永続的に変更するにはどうすればよいですか?
POSIXファイルシステムでファイルの名前を永続的に変更する正しい方法は何ですか?特にディレクトリのfsyncについて疑問に思っています。(これがOS / FSに依存する場合は、Linuxとext3 / ext4について質問しています)。
注:StackOverflowには、永続的な名前変更に関する他の質問がありますが、AFAICTではディレクトリのfsyncに対応していません(これは私にとって重要です-ファイルデータも変更していません)。
私は現在(Pythonで)持っています:
特定の質問:
- これも暗黙的にソースディレクトリをfsyncしますか?または、電源を入れ直した後、ファイルが両方のディレクトリに表示される可能性があります(つまり、ハードリンクカウントを確認して手動でリカバリを実行する必要があります)。つまり、永続的なアトミック移動操作を保証することは不可能ですか?
- 宛先ディレクトリの代わりにソースディレクトリをfsyncした場合、それは暗黙的に宛先ディレクトリもfsyncしますか?
- 関連する有用なテスト/デバッグ/学習ツール(フォールトインジェクター、イントロスペクションツール、モックファイルシステムなど)はありますか?
前もって感謝します。
linux - コミットごとに1つのfsyncでジャーナリングを実装することは可能ですか?
ジャーナリング/ログ先行書き込みストレージシステムを構築しているとしましょう。(トランザクションごとに)データを追加し(write(2)を使用)、コミットマーカーを追加してから、fsyncすることで、これを簡単に実装できますか?
考慮すべきシナリオは、このログに大量の書き込みを行ってからfsyncを実行し、fsync中に障害が発生した場合です。iノードの直接/間接ブロックポインタは、すべてのデータブロックがフラッシュされた後にのみフラッシュされますか、それともブロックが順番にフラッシュされるという保証はありませんか?後者の場合、リカバリ中にファイルの最後にコミットマーカーが表示されていると、そのファイルと前のコミットマーカーの間のデータに意味があるとは信じられません。したがって、ログファイルのどの範囲が一貫しているかを判断するには、別のメカニズム(少なくとも別のfsyncを含む)に依存する必要があります(たとえば、データの書き込み/ fsync、次にコミットマーカーの書き込み/ fsync)。
それが違いを生むなら、主にコンテキストとしてext3/ext4について疑問に思います。
database - PostgreSQL 9: ファイル "base/16386" を fsync できませんでした: 引数が無効です
私は小さな PostgreSQL セットアップをテストしようとしているので、簡単なローカル インストールをまとめました。ただし、createdb を使用して個人用データベースを作成しようとすると、このようなエラーで停止します (特に、最初は base/16384 で始まり、実行するたびに増加します)。ここで何が起こっているのか誰でも知っていますか、それとも私が見逃した些細な設定があれば、これが原因でしょうか? ありがとうございます。これは少し時間が重要なので、何か知っていることがあれば返信してください。ありがとう!
更新:
私はこれを CentOS 5 サーバーで実行しています。詳細があまりないことをお詫びします (そのサーバーの共有アカウントです)。uname -a の出力は次のとおりです。
Linux {省略} 2.6.18-194.11.4.el5 #1 SMP Tue Sep 21 05:04:09 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
次のソースから PostgreSQL をインストールしました。
http://wwwmaster.postgresql.org/download/mirrors-ftp/source/v9.0.1/postgresql-9.0.1.tar.bz2
ホームディレクトリにビルドされ、prefix=$HOME/local/pgsql にインストールされました。
これは、新しいデータ設定でユーザーのデータベースを作成しようとしている端末の読み取りです。
[htung@{OMITTED}:~]$ killall postgres
LOG: 自動バキューム ランチャーのシャットダウン
LOG: スマート シャットダウン要求の受信
LOG: シャットダウン
LOG: データベース システムのシャットダウン
[htung@{OMITTED}:~]$ rm -r tmp
mk [1]+ 完了 ../local/pgsql/bin/postgres -D $HOME/tmp (wd: ~/tmp)
(wd now: ~)
[htung@{OMITTED}:~]$ mkdir tmp
[htung@{ OMITTED}:~]$ local/pgsql/bin/initdb -D $HOME/tmp
このデータベース システムに属するファイルは、ユーザー「htung」が所有します。
このユーザーは、サーバー プロセスも所有している必要があります。
データベース クラスタは、ロケール en_US.UTF-8 で初期化されます。
したがって、デフォルトのデータベース エンコーディングは UTF8 に設定されています。
デフォルトのテキスト検索構成は「英語」に設定されます。
既存のディレクトリ /afs/{OMITTED}/htung/tmp のパーミッションを修正します ... OK
サブディレクトリを作成します ... OK
デフォルトの max_connections を選択します ... 100
デフォルトの shared_buffers を選択します ... 32MB
構成ファイルを作成します ... OK
template1 データベースを作成します/afs/{OMITTED}/htung/tmp/base/1 ... ok
pg_authid の初期化中 ... ok
依存関係の初期化中 ... ok
システム ビューの作成中 ... ok
システム オブジェクトの説明の読み込み中 ... ok
変換の作成中 .. . わかりました
辞書の作成 ... わかり
ました 組み込みオブジェクトの権限の設定 ... わかりました
情報スキーマの作成... わかりました
PL/pgSQL サーバー側言語のロード ...わかりました
データベース template1 のバキューム処理 ... わかりました
template1 を template0 にコピーする ... OK
template1 を postgres にコピーする ... OK
警告: ローカル接続の「信頼」認証を有効にしています これは、pg_hba.conf を編集するか、
次に initdb を実行するとき
に -A オプションを使用することで変更できます。
成功。以下を使用してデータベースサーバーを起動できるようになりました。
または
local/pgsql/bin/pg_ctl -D /afs/{OMITTED}/htung/tmp -l logfile start
[htung@{OMITTED}:~]$ local/pgsql/bin/postgres -D $HOME/tmp
LOG: database system was shut down at 2010-11-15 13:47:25 PST
LOG: autovacuum launcher started
LOG: databaseシステムは接続を受け入れる準備ができています
[1]+ local/pgsql/bin/postgres を停止 -D $HOME/tmp
[htung@{OMITTED}:~]$ bg
[1]+ local/pgsql/bin/postgres -D $HOME/tmp &
[htung@ {OMITTED}:~]$ local/pgsql/bin/createdb
エラー: ファイル "base/16384" を fsync できませんでした: 無効な引数
ステートメント: CREATE DATABASE htung;
createdb: データベースの作成に失敗しました: エラー: ファイル "base/16384" を fsync できませんでした: 引数が無効です
[htung@{OMITTED}:~]$
java - Android (Java) での ext4/fsync の状況が不明
Tim Bray の記事"Saving Data Safely"は未解決の問題を残しました。今日、それは 1 か月以上経ちましたが、フォローアップが見られなかったので、ここでトピックを扱うことにしました。
この記事のポイントの 1 つは、FileOutputStream を使用する場合、安全のために FileDescriptor.sync() を呼び出す必要があることです。Java を 12 年間やっている間、Java コードが同期しているのを見たことがなかったので、最初はとてもイライラしました。特に、ファイルへの対処はかなり基本的なことです。また、FileOutputStream の標準 JavaDoc は、同期をほのめかしませんでした (Java 1.0 - 6)。いくつかの調査の結果、ext4 が実際に同期を必要とする最初のメインストリーム ファイル システムである可能性があることがわかりました。(明示的な同期が推奨される他のファイル システムはありますか?)
この件についての一般的な考えに感謝しますが、具体的な質問もいくつかあります。
- Android はいつファイル システムと同期しますか? これは定期的であり、さらにライフ サイクル イベントに基づいている場合もあります (たとえば、アプリのプロセスがバックグラウンドに移行するなど)。
- FileDescriptor.sync() はメタデータの同期を処理しますか? つまり、変更されたファイルのディレクトリを同期しています。FileChannel.force() と比較してください。
- 通常、FileOutputStream に直接書き込むことはありません。これが私の解決策です(同意しますか?):
/code>
objective-c - libSystem.B.dylib からの fsync 例外をどのように処理すればよいですか?
このスタック トレースでクラッシュ レポートを取得しました。
fsync 例外が発生するのは残念ですが、たわごとが発生しますよね? 私の質問は、この例外をどのように処理すればよいですか? @try/@catch
ブロックで包む?
更新:クラッシュはスレッド 1 で発生しました。スレッド 1 からの完全なトレースは次のとおりです。
私が言えることは、WTF?ここで何らかの奇妙なシステムの問題が発生した可能性はありますか? そのトレースには自分のコードがまったく表示されないからです。
python - stdout / stderrファイル記述子でos.fsyncを呼び出すと、サブプロセスが強制終了されます
Pythonsubprocess
ライブラリを使用してサブプロセスを生成した後stderr
、子プロセスからシリアル化されたデータを含む親プロセスにメッセージを渡すために使用しています。stdin
次に、このデータに適用された関数の結果を(経由で)親に返すようにします。
本質的に、私はサブプロセス内に次のような関数を持っています。
ただし、これにより、stderr
入力を待機している間、親が完全にロックされるため、次のように呼び出しようとしました。
ただし、これは機能しません。os.fsync
が実行された後は何もありません。さらにproc.poll()
、親プロセスを呼び出すと、子の戻りコードは1であるように見えます。
これを防ぐために何ができますか?別のアプローチを検討する必要がありますか?