ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

Rubyでも SO_REUSEPORT 使いたい!

一般に同じアドレスを同じポートではlistenできない。しかし、ソケットのオプションに SO_REUSEPORT というものがあり、Linuxではカーネル3.9以降で利用できる。

ソケットを作成した後に setsockopt(2)SO_REUSEPORT が有効になるように指定すると、同じアドレス・同じポートでのbind/listenが可能になり、リクエストが来た際にはリスンしているソケットそれぞれに回されていく。

ただ、この機能はRubyTCPServerクラス ではすぐには利用できない。 TCPServer#new/open の終了時点でアドレスがリスンされ、setsockoptするタイミングがないため。ではどうするかというと、 Socket クラスでの各メソッド Socket#setsockopt/bind/listen を直接使えば良い。

続きを読む

ID Mapping/User Namespace再入門 その(1)

前のシリーズが終わる前に新シリーズを書いていく。

皆さんのIDはマッピングされていますか?

User Namespace とは?

まず、TenForwardさんによる日本語でのとてもわかりやすい解説がすでに存在するので、そちらを参照してから...。

gihyo.jp

User Namespace自体は、Linux名前空間機能の一つであり、ホストのユーザID(グループIDも含むが、簡便のためこの記事では「ユーザID」とだけ表現する)の振り出し方とコンテナ(名前空間)内部のIDの振り出し方を分離する機能である。

実は、User Namespaceを(unshare(2)などで)分離しただけでは、ホストのユーザIDが見えなくなるだけで、コンテナ内部では全てのIDがnobodyになってしまい、現実のプログラムを動かせない。Network Namespaceにおいて、分離後vethなどを引き出さないと結局現実の環境で使えないのと同じイメージである。

ということでこの際にホストのユーザIDとコンテナ内部IDとの対応関係を指定する必要がある。例えば、ホストの ID=100000 ~ ID=165534 を、コンテナの ID=0 ~ ID=65534 に対応させる、ということができる。この機能がID Mappingである。

そして、これもまた重要なのであるが、この場合にコンテナ内部で ID=0 に割り振られたユーザには、そのプロセスでの特権が与えられる。とはいえ、(時刻など)ホスト全体であったり、ホストの名前空間の操作に関わることはできない。一方で、そのプロセスのために別の名前空間を分離している場合は、その名前空間での操作が可能になる。たとえば、Network Namespaceを一緒に分離していればネットワークデバイスの設定ができるし、UTS Namespaceを一緒に分離していればホスト名の変更ができる。

また、User Namespaceはホストの一般ユーザが作成できる。非特権コンテナにおいては、User Namespaceのこういった特徴を利用して一般ユーザがなるべく安全にコンテナを作成できるようにしている。

User Namespace が解決してくれる問題

主に以下の二つの課題が解決できる。

  • もし特権を付与したコンテナをunjailされた場合等に、ホストのファイルシステムを操作されるなどの被害を最低限にしたい
  • 一般ユーザで、なるべく安全にコンテナを作成したい

User Namespace をユーザランドの実装的にはどう実現しているのか

続きを読む

PSIをLXCのコンテナで試す: その(1) CPU Pressure

あらすじ

PSIという新しいシステムプレッシャーの指標が Linux 4.20 から利用できます。という内容を前回のブログに書いた。

udzura.hatenablog.jp

今日はこのPSIについて、実際にシステムに負荷をかけたりして変動を眺める。

続きを読む

Ubuntu(などdeb系なLinux)でLinux 4.20 + PSIなカーネルを入れる

あけましておめでとう😂!

では、今日はLinux 4.20より導入された PSI を試していきたいわけですが、まずは環境構築からやっていきたいとおもいます。今後、「〜していきたい」と言う表現が続きますが、そこは任意のユーチューバーやゲーム実況者の声に置き換えてお読みください。

PSIは公式サイトがあります。

facebookmicrosites.github.io

Pressure Stall Information とは、各種リソース、CPU/メモリ/IO のプレッシャー状況を取得する方法で、具体的には /proc やcgroup2配下のファイルを経由してゲットできます。いわゆるロードアベレージのように参照できるのかどうかが気になっていて、色々試していきたいと思います。

ちなみに、TenForwardさんがすでに紹介記事を軽く書いていますので、僕はあれですね、フォロワーとしてやっていきたい。

tenforward.hatenablog.com

tenforward.hatenablog.com

続きを読む