POSIX MQは今いちイケてない


TL;DR

標準仕様が使いづらいパラメータってのはどうなんよ?
動的にパラメータを変更させてくれよ。

POSIX MQは便利で不便

POSIX MQは使ってみればわかるが便利だ。

  • 高速(UDS/NamedPipe比)
  • Read/Writeどちらが先にOpenしてもよい
  • 両端を閉じても再びOpenすればデータが残っている(これは欠点でもある)
  • リブートすればキューが消えるので後始末不要(これは欠点略

そんな使いやすいPOSIXメッセージキューだが大きな欠点がある。
パラメータのチューニングがシステムパラメータでしかできない。
設定は /proc/sys/fs/mqueue/ 配下に置かれている。
はい、ファイルです。編集には特権が必要です。まずこの時点でクソ。

キューのパラメータは標準では

  • メッセージ数10
  • メッセージサイズ8192 bytes

となっている。このパラメータ選定がさらにクソである。
メッセージサイズ8KBで保持数10とかまったく融通が利かない。

UDS/Pipeと比較して

IPCの仕様を検討する場合、UDSやPIPEのようにストリームならNo Settingだ。
ただしメッセージ区切りがないのでWrite側がオーバーランすると面倒である。

その点、MQは固定サイズメッセージの配列と考えることができる。
Write側が多少オーバーランしても、Read側のまとめ読みで帳尻合わせできる。
固定サイズメッセージだから区切りもわかるしデータの振り分けもできる。
だが上記の基本パラメータは使いにくい。

パラメータ変更のAPI

あることはある。とってもとっても使えないAPIだがある。
その名もmq_setattr()である。
だがこのAPI、メッセージ数もメッセージサイズも変更できない。
変更可能なのはキューのブロッキング属性のみである。
いやいやそんなもんブロッキングで使うに決まってるでしょ。
yield()しながらノンブロッキングで高速回転なんて無駄すぎる。
まあそれにしてもメッセージ数とメッセージサイズは変更したかった。
4KB x 20msg とか
256byte x 320msgとか
柔軟な使い方がしたかったのだができない。できないものはできない。

ということで

IEEE様がPOSIX MQの仕様を拡張してくれることを願うのみである。
有志では、メッセージキューの仕組みをso(DLL)で実現した人もいる。
本当に自由度のあるキューがほしいなら自作しかないのだろう。
とても残念だ。