CentOS7.9 で io.Copy がハングする:splice システムコールと古い Linux カーネルの相性問題
事象の概要
Go 1.21.0〜1.21.4 でコンパイルした TCP プロキシが CentOS 7.9(カーネル 3.10.0)上で動作中、io.Copy が永遠に戻らなくなるケースが発生しました。
原因は net.TCPConn.ReadFrom が内部的に使う splice が SPLICE_F_NONBLOCK フラグを失ったことで、ノンブロッキング動作が無効になり、古いカーネルでブロックしていたためです。
Go 1.21.5 で該当フラグが ...
7月23日 22:50 投稿
epoll のカーネルソースを読むための準備
はじめに
epoll は Linux カーネル 2.6 で導入された I/O イベント通知機構で、select(2) や poll(2) の代替として利用されます。本記事では、epoll のソースコードを読む前に理解しておくべき基礎知識を整理します。
従来の I/O マルチプレクサの問題点
select(2): 最大 1024 個のファイル記述子しか扱えず、毎回ユーザ空間とカーネル空間の間でデータをコピーする必 ...
6月7日 16:24 投稿
Linux platform デバイスドライバの設計と実装
Linux カーネルにおけるデバイスドライバは、モジュール性と再利用性を高めるために「分離」と「階層化」の設計原則に基づいて構築される。特に、I2C や SPI といったバスに接続されるデバイスだけでなく、SoC 内蔵のペリフェラル(例: GPIO、タイマ、UART など)に対しても、統一された抽象化フレームワークが必要となる。そのため、Linux は物理的なバスを持たないデバイ ...
5月28日 01:16 投稿