<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Préface de l'article(N'a rien à voir avec le texte)</span></span><span>
</span><span><span class="hljs-comment">// Ici, il peut s'agir de n'importe quel code ou commentaire d'initialisation</span></span><span>
</span><span><span class="hljs-comment">// Cette partie du contenu n'a rien à voir avec le texte principal de l'article,Par exemple seulement</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 Utilisé dans fsync Quelle est la raison de la dégradation des performances dans la fonction?Comment optimiser?
*/</span>
<span class="hljs-comment">/*
exister PHP milieu,fsync Les fonctions sont utilisées pour forcer les données du tampon de fichier sur le disque,Assurer la persistance et l'intégrité de vos données。Bien que fsync Peut assurer la sécurité des données,但它exister实际使用milieu常常导致性能下降,尤其是exister高频繁写入de场景milieu。Cet article discutera des raisons de la dégradation des performances,Et faire des suggestions d'optimisation。
*/</span>
<span class="hljs-comment">/*
un、Raisons de la dégradation des performances
1. Au-dessus des écritures synchrones sur le disque
fsync Appelez directement l'opération de synchronisation sous-jacente du système,将内核缓冲区milieude数据强制写入disque,Attendez que le disque termine l'opération d'écriture physiquement。disque I/O Le fonctionnement physique est beaucoup plus lent que la vitesse de mémoire,Par conséquent chaque appel fsync Tous peuvent introduire de plus grands retards。
2. Propriétés obstructives
fsync 是un个阻塞函数,exister完成写入之前会阻塞当前进程或线程。Beaucoup d'appels fréquents fsync Cela provoquera des pauses de programme à long terme,À son tour, affecter les performances globales。
3. disque设备差异
不同类型dedisque设备(Disque dur mécanique vs SSD)droite fsync Il existe des différences significatives dans les temps de réponse,Disque dur mécanique物理寻址时间长,fsync Retard plus évident。
4. Impact au niveau du système de fichiers et du système d'exploitation
不同de文件系统droite fsync de实现和优化存exister差异,Certains systèmes de fichiers peuvent être réduits grâce à des mécanismes de journalisation fsync Coût,Mais il y a aussi des frais généraux du système de fichiers。
*/</span>
<span class="hljs-comment">/*
deux、Comment optimiser fsync Performance
1. réduire fsync Nombre d'appels
Après avoir combiné plusieurs opérations d'écriture,再调用un次 fsync,避免每写un小块数据就调用 fsync。
2. Écriture asynchrone et écriture par lots
Des files d'attente asynchrones ou des mécanismes de cache peuvent être utilisés,Écrivez d'abord des données pour se cacher,Appel régulier ou par lots fsync,réduire阻塞频率。
3. Utilisez des périphériques de stockage plus rapides
utiliser SSD 替代Disque dur mécanique,Peut réduire considérablement fsync Écrire un retard。
4. Sélectionnez le bon système de fichiers
选择droite同步写入优化较好de文件系统,Par exemple ext4 de journaling modèle,或者其他支持更高效写入de文件系统。
5. Évaluez s'il est nécessaire de l'utiliser fsync
如果droite数据持久性要求不是特别严格,Vous pouvez envisager d'utiliser fflush Ou appel retardé fsync,Compromis sur les performances et la sécurité des données。
*/</span>
<span class="hljs-comment">/*
trois、Exemple d'optimisation de code
*/</span>
</span><span><span class="hljs-comment">// Exemples non optimisés:Appel fréquent 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">// Force la synchronisation pour chaque écriture,Performance extrêmement mauvaise</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">// Exemple d'optimisation:Écriture par lots,最后统un调用 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">// 只调用un次 fsync,réduire阻塞</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">/*
Résumer:
fsync Assurer la sécurité des données,但其同步写disquede特性导致了性能瓶颈。Concevoir une stratégie d'écriture rationnellement、réduire调用频率和选择合适de存储设备,可以exister保证数据安全de前提下,Optimiser les performances。
*/</span>
</span></span>
<hr>