<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 記事序文(テキストとは何の関係もありません)</span></span><span>
</span><span><span class="hljs-comment">// ここでは、任意の初期化コードまたはコメントにすることができます</span></span><span>
</span><span><span class="hljs-comment">// コンテンツのこの部分は、記事のメインテキストとは何の関係もありません,たとえば、のみ</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-meta"><?php</span></span><span>
<span class="hljs-comment">/*
PHP で使用されます fsync 機能におけるパフォーマンス低下の理由は何ですか?最適化する方法?
*/</span>
<span class="hljs-comment">/*
存在する PHP 真ん中,fsync 機能は、ファイルバッファーのデータをディスクに強制するために使用されます,データの永続性と完全性を確保します。それでも fsync データセキュリティを確保できます,但它存在する实际使用真ん中常常导致性能下降,尤其是存在する高频繁写入の场景真ん中。この記事では、パフォーマンスの劣化の理由について説明します,そして、最適化の提案をします。
*/</span>
<span class="hljs-comment">/*
1つ、パフォーマンスの劣化の理由
1. 同期のオーバーヘッドはディスクに書き込みます
fsync システムの基礎となる同期操作を直接呼び出します,将内核缓冲区真ん中の数据强制写入ディスク,ディスクが物理のに書き込み操作を完了するのを待ちます。ディスク I/O 物理のな動作は、メモリ速度よりもはるかに遅いです,したがって、すべての呼び出し fsync すべてがより大きな遅延を導入するかもしれません。
2. 閉塞性特性
fsync 是1つ个阻塞函数,存在する完成写入之前会阻塞当前进程或线程。頻繁な電話 fsync それは長期のなプログラムの一時停止を引き起こします,次に、全体のなパフォーマンスに影響を与えます。
3. ディスク设备差异
不同类型のディスク设备(メカニカルハードディスク vs SSD)右 fsync 応答時間に大きな違いがあります,メカニカルハードディスク物理寻址时间长,fsync より明白な遅延。
4. ファイルシステムとオペレーティングシステムレベルでの影響
不同の文件系统右 fsync の实现和优化存存在する差异,一部のファイルシステムは、ロギングメカニズムによって削減される場合があります fsync のコスト,しかし、ファイルシステムのオーバーヘッドもあります。
*/</span>
<span class="hljs-comment">/*
二、最適化する方法 fsync パフォーマンス
1. 減らす fsync 通話数
複数の書き込み操作を組み合わせた後,再调用1つ次 fsync,避免每写1つ小块数据就调用 fsync。
2. 非同期書き込みとバッチ書き込み
非同期キューまたはキャッシュメカニズムを使用できます,最初にキャッシュするためにデータを記述します,通常またはバッチコール fsync,減らす阻塞频率。
3. より高速なストレージデバイスを使用します
使用 SSD 替代メカニカルハードディスク,大幅に減らすことができます fsync 遅延を書き込みます。
4. 適切なファイルシステムを選択します
选择右同步写入优化较好の文件系统,例えば ext4 の journaling モデル,或者其他支持更高效写入の文件系统。
5. それを使用する必要があるかどうかを評価します fsync
如果右数据持久性要求不是特别严格,使用を検討できます fflush または遅延コール fsync,パフォーマンスとデータセキュリティに関するトレードオフ。
*/</span>
<span class="hljs-comment">/*
三つ、サンプルコードの最適化
*/</span>
</span><span><span class="hljs-comment">// 最適化されていない例:頻繁に電話 fsync</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'data.log'</span></span><span>, </span><span><span class="hljs-string">'a'</span></span><span>);
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-number">1000</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-string">"Line <span class="hljs-subst">$i</span></span></span><span>\n");
</span><span><span class="hljs-title function_ invoke__">fflush</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-comment">// 各書き込みの力の同期,パフォーマンスが非常に低い</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fsync</span></span><span>(</span><span><span class="hljs-title function_ invoke__">fileno</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>));
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-comment">// 最適化の例:バッチライティング,最后统1つ调用 fsync</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'data.log'</span></span><span>, </span><span><span class="hljs-string">'a'</span></span><span>);
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-number">1000</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-string">"Line <span class="hljs-subst">$i</span></span></span><span>\n");
}
</span><span><span class="hljs-title function_ invoke__">fflush</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fsync</span></span><span>(</span><span><span class="hljs-title function_ invoke__">fileno</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)); </span><span><span class="hljs-comment">// 只调用1つ次 fsync,減らす阻塞</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
<span class="hljs-comment">/*
要約します:
fsync データセキュリティを確保します,但其同步写ディスクの特性导致了性能瓶颈。ライティング戦略を合理的に設計します、減らす调用频率和选择合适の存储设备,可以存在する保证数据安全の前提下,パフォーマンスを最適化します。
*/</span>
</span></span>
<hr>