Skip to main content

Command Palette

Search for a command to run...

Apache Bench でベンチマークできるミニマルな C 言語製 HTTP サーバ

Published
Apache Bench でベンチマークできるミニマルな C 言語製 HTTP サーバ

ab コマンド, つまり Apache HTTP server benchmarking tool をつかってベンチマークできる状態の HTTP サーバを C 言語で作る. なるべくシンプルに必要最小限の要素のみを持ったコードを目指す.

手堅いエンジニアは高速化のために, いきなりコードを書いたりしない. 計測できる環境を整えておかないと, 高速化をしてもその効果を測ることができない.
このサーバを出発点として手を加えて (例えばマルチスレッド化したり IO 多重化をしたりして) サーバのパフォーマンスがどのように変化するかを確かめるために使うことを想定している. ソースコード全体は https://github.com/momori256/cs2 にある.

ソケット

ab を使うには HTTP を解すサーバでなければならないため, まずは TCP での通信を実装する.
ソケットプログラミングはお決まりのコードなので説明は省く. いつもお決まりを忘れてしまうので, man getaddrinfo の EXAMPLE をいつも参照している.

socket, bind, listen をして accept できるソケットを作成する部分は以下の関数だ.

HTTP リクエストとレスポンス

accept して read すればメッセージを受信できる. 動作の確認には telnet のようなプリミティブなツールが役に立つ.

メッセージの受信ができるようになったので, 後は適切なレスポンスを返すだけだ. HTTP の仕様は MDN のページをいつも参考にしている. HTTP Messages によると, 例えば以下のようなレスポンスを返せば良さそうだ.

HTTP/1.0 200 OK
Content-Length: 5

hello

今回は受け取ったリクエストをそのまま body として返すことにする. 実際には例えば DB サーバなら, 典型的には SQL を実行してその結果を返すことになるだろう.

早速 ab を使ってみる. まずはクライアント数 1, リクエスト数 1 とする.

ab -c 1 -n 1 localhost:22421/

リクエストは以下のような形式で body はなかった.

GET / HTTP/1.0
Host: localhost:22421
User-Agent: ApacheBench/2.3
Accept: */*

サーバが正常に動作していればベンチマークは一瞬で終わり, 以下のような結果が表示される.

> ab -c 1 -n 1 localhost:22421/

This is ApacheBench, Version 2.3 <$Revision: 1903618 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:
Server Hostname:        localhost
Server Port:            22421

Document Path:          /
Document Length:        83 bytes

Concurrency Level:      1
Time taken for tests:   0.000 seconds
Complete requests:      1
Failed requests:        0
Total transferred:      122 bytes
HTML transferred:       83 bytes
Requests per second:    5952.38 [#/sec] (mean)
Time per request:       0.168 [ms] (mean)
Time per request:       0.168 [ms] (mean, across all concurrent requests)
Transfer rate:          709.17 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     0    0   0.0      0       0
Waiting:        0    0   0.0      0       0
Total:          0    0   0.0      0       0

83 bytes の HTML が 0.168 ms で返ってきたことが分かる. ab の引数を変えて様々な値のクライアント数, リクエスト数で試してみて, サーバのパフォーマンスを測る.
ベンチマークとしては Requests per second, つまり 1 秒間に何個のリクエストを処理できたかという指標がよく利用される(Performance metrics).

結語

なるべくシンプルに最小限 HTTP をやり取りできるサーバを書いた. サーバのベンチマークは初めてだったが, HTTP/1.0 の単純さとab のおかげで意外と簡単にできた.
マルチスレッド, マルチプロセス, スレッドプール, IO 多重化といった物事を試すのに, やはり定量的な指標があると良い指針となる. 実際に動かして簡単に実験できる環境を作ることがプログラミングでは重要だと思う.

More from this blog

キャリア 6 年目の振り返り

2020 年 4 月に働き始めてから 6 年近く経過した。今年を振り返ってまとめておく。 正社員化 2025 年前半あたりは、生活に安定感がなくジャグリングをしているような感覚だった。学校の卒業、ビザの切り替え、インターンから正社員への移行という3つのイベントを同時に進めていた。結果的に 5 月から正社員として働き始めたが、計画通りには行かなかった。 会社の人事プロセスが大幅に遅延した。本来は 4 月から働き始める予定だったのに、一ヶ月以上遅れて 5 月になってしまった。これに関しては、本当にこ...

Dec 29, 2025
キャリア 6 年目の振り返り

キャリア 5 年目の振り返り

2020 年 4 月に働き始めてから 5 年が経った。本当は毎年 12 月に一年の振り返りをしようと思っていたのだが、今回はいろいろあって 4 月になってしまったので、2024 年 1 月から 2025 年の今までを対象として振り返りをして、今年の目標を書こうと思う。 海外就職 カナダに渡航して約 1 年半経った。最初の一年間は private college という日本の専門学校のようなところに通っていて、それからジョブオファーを得て働き始めた。 海外で働いてキャリアを積むというのがカナダに来...

Apr 14, 2025
キャリア 5 年目の振り返り

ReRe: Recursive Redefinition

38 posts

Apache Bench でベンチマークできるミニマルな C 言語製 HTTP サーバ