2.2. Ticket Spinlocks
システム設定における要点は、あるプロセスが別のプロセスが使用しているメモリを変更しないようにすることです。メモリにおける未制御のデータ変更は、データ破損やシステムクラッシュにつながりかねません。これを防ぐには、プロセスがメモリの一部のロックし、オペレーションを実行し、その後にメモリをアンロックもしくは「自由」にすることをオペレーティングシステムが許可するようにします。
メモリロッキングのよくある実装は spin locks によるもので、これによりプロセスはロックが利用可能かどうかを継続してチェックできるようになり、利用可能になり次第にロックを取得します。複数のプロセスが同一ロックの取得で競合している場合は、ロックが利用可能になってから最初に要請したプロセスがこれを取得します。すべてのプロセスがメモリに同一のアクセスを持っている場合、このアプローチは「公平」で、うまく機能します。
残念ながら NUMA システム上では、すべてのプロセスがロックへ同等のアクセスを持っているわけではありません。ロックと同様の NUMA ノード上にあるプロセスには、ロック取得の不公平な優位性があります。リモート NUMA ノード上のプロセスはロック不足に陥り、パフォーマンスが低下します。
この問題に対処するため、Red Hat Enterprise Linux は ticket spinlocks を実装しました。この機能は、ロックへの予約キューメカニズムを追加し、すべての プロセスが要請した順番でロックを取得できるようにします。これにより、ロック要請におけるタイミングの問題と不公平な優位性を排除します。
Ticket spinlock のオーバーヘッドは通常の spinlock よりも多少大きくなりますが、拡張性に優れ、NUMA システム上でのすぐれたパフォーマンスを提供します。