This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

2016年12月31日土曜日

膵臓がん治療・手術の大発展-門脈カテーテルバイパス法とMesenteric approach


  • #膵臓がん・膵がん
  • #肝臓・胆のう・すい臓の病気
公開日:
更新日:
膵臓がん治療・手術の大発展-門脈カテーテルバイパス法とMesenteric approach

中尾 昭公

中尾 昭公先生名古屋セントラル病院 院長

かつては5年後生存率が20%以下だった膵臓がん。最も治りにくく、手術でしか根治できない膵臓がんに「門脈カテーテルバイパス法」「Mesenteric approach」という2つの新しい手術方法をもたらした外科医が、名古屋セントラル病院 院長の中尾昭公(なかお あきまさ)先生です。門脈カテーテルバイパス法とMesenteric approachとはいったいどんな手術なのか、中尾昭公先生に解説していただきました。

膵臓がんとは-膵臓がんの治療の難しさ

膵臓がん

膵臓がんは早期発見が難しく治りにくいがん

膵臓がんとは主に膵管の細胞にできるがんで、特に50歳以上の高齢の男性に起きやすいがんです。膵臓がんの死亡数は年間3万人程度で、これは膵臓がんの罹患数とあまり変わりません。つまり、膵臓がんは見つかると非常に治りにくいがんなのです。

膵臓がんには特徴的な症状がありません。自覚症状が比較的少ないことも、膵臓がんの発見の遅れと高い死亡率につながっています。何となく腹痛がする、食欲がない、体重が減るといった症状が起こりますが、これは膵臓がん特有のものではなく他の病気でもよくみられる症状のため、早期発見が難しいです。それに加え膵臓は胃の裏側という体の奥にある臓器のため検査が困難なことも、早期発見を難しくしています。

膵臓がんの手術

膵臓がんを根治させるには、手術しかありません。膵臓がんは進行の早いがんのため、発見され手術が可能と判断されたら、早期に手術に踏み切ることが大切です。膵臓がんのステージがⅠ〜Ⅲ、Ⅳaの一部において手術が実施されます。

膵臓がんの多くは膵頭部という膵臓の先が丸く膨らんでいる部分にできます。この膵頭部にできたがんを取る手術が、膵頭十二指腸切除術です。

膵頭十二指腸切除術

膵頭十二指腸切除術は膵頭と一緒に十二指腸や胆管・胆のうを切除します。がんが胃の近くまで広がっている場合は胃の一部も切除することがあります。がんは時により血管まで浸潤していることもあるため、その際には血管ごと切除して血管再建術を行います。

膵臓がん治療の光明、門脈カテーテルバイパス法

門脈カテーテルバイパス法ー門脈の大量の血液を特殊チューブで迂回し出血のリスクがない

 

門脈カテーテルバイパス法

膵臓がんは進行が早く、血管に浸潤していることが少なくありません。特に門脈という腸から大量の血液が送られる太い静脈に浸潤すると、従来は手術不可能だといわれていました。もし門脈にまで及んだ膵臓がんを切除しようすれば門脈から大出血を起こし、患者さんの命を危険にさらしてしまう可能性があるからです。

しかし私は「門脈に及んだ膵臓がんも技術力で安全に取れる方法があるはずだ」と試行錯誤を重ねました。そして門脈の血液を特殊なチューブで迂回(うかい)させることで門脈の血流を止め、門脈からの出血のリスクなく手術できる「門脈カテーテルバイパス法」を開発し、1981年に1例目の臨床を行いました。門脈カテーテルバイパス法によって膵臓がんを門脈と一緒に取れるようになり、門脈にまで浸潤した膵臓がんの患者さんの手術も可能になりました。膵臓がんの切除率は平均30%程度ですが、この門脈カテーテルバイパス法を用いた私の手術では、切除率は65%まで向上しました。

門脈カテーテルバイパス法は肝移植や肝胆膵の合併切除にも使用可能

門脈カテーテルバイパス法は膵臓がんの門脈合併切除のために開発した術式ですが、肝移植や胆管がん、肝臓がんの切除にも使用することができます。

たとえば肝臓がんが下大静脈に浸潤した際に門脈カテーテルバイパス法を用いて下大静脈の血液を心臓に送ることで血液を止め、下大静脈ごと肝臓がんを切除する、などといったように応用できます。


Mesenteric approachにより膵臓がんに触ることなく安全に到達

がん手術の理想!ノンタッチ・アイソレーション

 

mesenteric approach

がんの手術においては、がんに触ったときにがん細胞が血液やリンパ節に乗って飛散しないために入ってくる血液と出て行く血液をすべて止めてから、なるべくがんに触らないで手術をするのが理想だといわれています。これを「ノンタッチ・アイソレーション」と呼びます。しかしながら実際、膵臓がんは体の奥深くにあり多数の臓器に囲まれているため、膵臓をつかんで起こさないと手術ができません。そのためノンタッチ・アイソレーションは不可能ではないかといわれていました。

膵臓がんの手術において膵臓の病変に到達するには、膵頭部を後腹膜から持ち上げて手で握りながら手術をすること(Kocherのマニーバー)が通常です。これではがんを触ってしまいますから、私は膵臓に触ることなく膵臓がんに到達する方法を考えました。それが今から説明するMesenteric approachです。

Mesenteric approachはトライツ靭帯から十二指腸下行脚下縁に向かって腸間膜根部に横切開し郭清(かくせい・周辺のリンパ節を切除すること)していくことによって上腸間膜動脈と上腸間膜静脈、中結腸動脈を露出しながら郭清します。そして周囲の血管を縛り、血液の流れを止めます。

がん細胞はリンパ節に転移しやすいため、郭清することによってがんを根治・予防します。がんではないところから郭清し、がんのない手術領域を確保することで膵臓がんに触れることなく安全にがんに到達、切除できるのです。

門脈カテーテルバイパス法とMesenteric approachにより膵臓がんの生存率が向上

 

中尾先生

門脈カテーテルバイパス法とMesenteric approachにより、がんに触ることなく安全に膵臓に到達でき、そして門脈カテーテルバイパス法を用いて門脈の血液を止めることで、切除が難しいとされる膵臓がんの切除率は大幅に向上しました。併せてTS-1やアブラキサン、ゲムシタビンなどの抗がん剤による化学療法を利用し、今では膵臓がん切除例の5年生存率は40%にまで上がっています。一昔前の膵臓がん切除例の5年生存率が10〜20%だったことを考えると、これは飛躍的な伸びだと思います。

もちろん化学療法の発展が生存率の向上に寄与しているのは確かです。しかしそれ以上に門脈カテーテルバイパス法とMesenteric approachによって限りなく出血を抑え患者さんの体の負担を極力少なくしたことも、膵臓がんの生存率向上に寄与したのではないかと私は考えています。

実際、私のもとには世界中から医師が手術見学に訪れます。非常に技術力を要する手術ですから、門脈カテーテルバイパス法とMesenteric approachの手術手技を獲得するのは容易なことではありません。それでも多くの膵臓がんの患者さんにこの手術を受けてもらうために、これからも門脈カテーテルバイパス法とMesenteric approachの手術手技を伝えていきたいと考えています。

 

GoとかScalaとかNode.JSとかでベンチマーク

勉強の為に引用しました。
http://sudix.github.io/blog/2014/03/12/frame-work-benchmark/


最近、色々API化したいものがあって、何で書けばいいかなぁと考えている。 とにかく速く、複数のDBから並列でデータをもってきて集約して返す、ようなのを作りたい。 そんな事考えているとき、こんなブログをみつけた。
なかなか興味深いので、GoとNode.jsの他にも、気になっていたFinagleとかも入れて、 自分も同じようにベンチマークを取ってみた。

disclaimer(いいわけ)

ベンチマークのとり方ははそんなに厳密にとっているわけでありません。カジュアルな感じで。 サーバもクライアント(Apache Bench)も同一マシンで実行しちゃってます。 もっとこうすべきとかあれば教えてください。 あと、計測結果は長くなりすぎたので、最後に置いています。

測定について

実行方法

元ブログと同じように、httpで1MBのコンテンツを返すだけのAPIを作り、 Apache Benchで測定する。測定結果は5回連続実行後の最後のものを使用。 メモリの使用量を見るため、procfsで 最大物理メモリ使用量も見る。

マシンスペック

CPU Core i7-2600
メモリ 8GB
OS Ubuntu 13.10 64bit

バージョン等

言語・FW名バージョン
Go go1.2 linux/amd64
Node.js v0.10.26
Scala 2.10.3
Finagle 6.12.1
Spray 1.1.0

登場選手たち

Go

最近噂のGoogle生まれのあいつ。C++の代替を狙っていたのに、 なぜかPythonistaやRubyistからばかり注目されてるとか。 小さな言語仕様、お手軽な並列処理などが特徴。
※テストコードは元ブログのコードをそのまま流用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "net/http"

func main() {
  bytes := make([]byte, 1024*1024)
  for i := 0; i < len(bytes); i++ {
      bytes[i] = 100
  }

  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
      w.Write(bytes)
  })
  http.ListenAndServe(":8000", nil)
}

Go/Martini

気になっていたGo用軽量WEBフレームワーク。ついでに試してみた。 Sinatra風味。なんせ公式サイトがかっこいい。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
  "github.com/codegangsta/martini"
  "net/http"
)

func main() {
  bytes := make([]byte, 1024*1024)
  for i := 0; i < len(bytes); i++ {
      bytes[i] = 100
  }

  m := martini.Classic()
  m.Get("/", func() []byte {
      return bytes
  })
  //m.Run() これで起動するとポートは3000
  http.ListenAndServe(":8000", m) //ポートを指定したい場合はこっち
}

Node.js

ブラウザ界の住人だったはずのあいつが、サーバサイドにもやってきた。 自分はJavaScriptは苦手だしあまり好きじゃないと思っていたけれど、少し触ってみたらなかなか楽しい。 ブラウザ側でJavaScriptを極めた方々からすれば、 サーバサイドまで全て同一言語で完結できるのはまさに夢のようだろうなぁと思う。
※テストコードは元ブログのコードをそのまま流用。

1
2
3
4
5
6
7
8
9
10
http = require('http')
Buffer = require('buffer').Buffer;
n = 1024*1024;
b = new Buffer(n);
for (var i = 0; i < n; i++) b[i] = 100;

http.createServer(function (req, res) {
  res.writeHead(200);
  res.end(b);
}).listen(8000);

Scala/Finagle

FinagleはTwitterのバックエンドで使われてるすごいやつらしい。
あのサイトのトラフィックをさばいてるんだからさぞかし凄いんだろう。 ZooKeeprと連携したり、各種Metricsを取れるようになってたり、ただものではない感がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package jp.sudix.finagle.benchmark

import com.twitter.finagle.Service
import com.twitter.finagle.http.Http
import com.twitter.util.Future
import com.twitter.finagle.builder.ServerBuilder
import org.jboss.netty.handler.codec.http.{DefaultHttpResponse, HttpVersion, HttpResponseStatus, HttpRequest, HttpResponse}
import org.jboss.netty.buffer.ChannelBuffers.copiedBuffer
import java.net.{SocketAddress, InetSocketAddress}

object Main {

  def main(args: Array[String]) {

    val bytes: Array[Byte] = Array.fill(1024*1024)(100:Byte)
    val cb = copiedBuffer(bytes)
    val response = new DefaultHttpResponse(HttpVersion.HTTP_1_1,
                                           HttpResponseStatus.OK)
    response.setContent(cb)

    val service = new Service[HttpRequest, HttpResponse] {
      def apply(request: HttpRequest) = {
        Future.value(response)
      }
    }

    val address: SocketAddress = new InetSocketAddress(8000)
    ServerBuilder()
      .codec(Http())
      .bindTo(address)
      .name("HttpServer")
      .build(service)
  }
}

Scala/Spray

これもScala用フレームワーク。AkkaというActorを使った非同期フレームワーク。 Finagleのなんでもできるよ感と違って、REST APIを作るのに特化してるっぽい。
*サンプルプロジェクトをちょっといじっただけ

1
2
3
4
5
6
7
8
9
10
11
package com.example

import akka.actor.{ActorSystem, Props}
import akka.io.IO
import spray.can.Http

object Boot extends App {
  implicit val system = ActorSystem("on-spray-can")
  val service = system.actorOf(Props[MyServiceActor], "demo-service")
  IO(Http) ! Http.Bind(service, interface = "localhost", port = 8000)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.example

import akka.actor.Actor
import spray.routing._
import spray.http._
import MediaTypes._

class MyServiceActor extends Actor with MyService {
  def actorRefFactory = context
  def receive = runRoute(myRoute)
}

trait MyService extends HttpService {
  val bytes: Array[Byte] = Array.fill(1024*1024)(100:Byte)
  val myRoute =
    path("") {
      get {
        respondWithMediaType(`text/html`) {
          complete {
            bytes
          }
        }
      }
    }
}


結果一覧

下記のコマンドを実行した結果

1
$ ab -c 100 -n 10000 http://localhost:8000/

言語・FW実行時間(秒)処理数/秒応答時間(ミリ秒)物理メモリ使用量(KB)
Go 4.3122319.1043.1208084
Go/Martini 4.7572102.2745.4757928
Node.js 4.3462300.7443.46456892
Scala/Finagle 7.6821301.6976.823807656
Scala/Spray 6.1841146.3161.843833040

感想

GoやNode.jsと比べるとScala勢が遅い感じがするけど、FinagleやSprayは重量級で機能豊富なフレームワークだと思うので、 同じ土俵で比べるのは酷だった気がする。実際はDBからデータ取ってきたりというステップが入るので、 速度差は埋まっていくだろうし、性能的にはどれ使っても問題無い気がしている。 Scalaのメモリ使用量が多すぎる気がするけど、JVMアプリのメモリ測定方法は、今回のでは正確に出ないのかも。 この程度のベンチマークでどれを採用するかまでは決められないけれど、Goのメモリフットプリントの少なさはいいなと思う。 どれか一つ選べと言われたら、Go/Martiniあたりがいいかなぁ。 なんかGoはサクサク書けて気持ちいい。

結果詳細

Go

結果

ab


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$ ab -c 100 -n 10000 http://localhost:8000/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
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)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:
Server Hostname:        localhost
Server Port:            8000

Document Path:          /
Document Length:        1048576 bytes

Concurrency Level:      100
Time taken for tests:   4.312 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      10486730000 bytes
HTML transferred:       10485760000 bytes
Requests per second:    2319.10 [#/sec] (mean)
Time per request:       43.120 [ms] (mean)
Time per request:       0.431 [ms] (mean, across all concurrent requests)
Transfer rate:          2374973.45 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      1      11
Processing:    13   42   2.6     42      74
Waiting:        0    1   2.2      1      33
Total:         14   43   2.7     43      76

Percentage of the requests served within a certain time (ms)
  50%     43
  66%     43
  75%     43
  80%     44
  90%     44
  95%     45
  98%     46
  99%     48
 100%     76 (longest request)

procfs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ cat /proc/`pgrep -lf 'go_server' | awk '{print $1}'`/status
Name: go_server
State:    S (sleeping)
Tgid: 14952
Pid:  14952
PPid: 6925
TracerPid:    0
Uid:  1000    1000    1000    1000
Gid:  1000    1000    1000    1000
FDSize:   256
Groups:   4 24 27 30 46 108 109 1000
VmPeak:     239304 kB
VmSize:     185236 kB
VmLck:           0 kB
VmPin:           0 kB
VmHWM:        8084 kB
VmRSS:        8084 kB
VmData:     174376 kB
VmStk:         140 kB
VmExe:        1452 kB
VmLib:        2012 kB
VmPTE:          80 kB
VmSwap:          0 kB
Threads:  5
SigQ: 0/63671
SigPnd:   0000000000000000
ShdPnd:   0000000000000000
SigBlk:   0000000000000000
SigIgn:   0000000000000000
SigCgt:   ffffffffffc1feff
CapInh:   0000000000000000
CapPrm:   0000000000000000
CapEff:   0000000000000000
CapBnd:   0000001fffffffff
Seccomp:  0
Cpus_allowed: ffffffff,ffffffff
Cpus_allowed_list:    0-63
Mems_allowed: 00000000,00000001
Mems_allowed_list:    0
voluntary_ctxt_switches:  9951
nonvoluntary_ctxt_switches:   7772

Go/Martini

結果

ab


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$ ab -c 100 -n 10000 http://localhost:8000/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
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)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:
Server Hostname:        localhost
Server Port:            8000

Document Path:          /
Document Length:        1048576 bytes

Concurrency Level:      100
Time taken for tests:   4.757 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      10486730000 bytes
HTML transferred:       10485760000 bytes
Requests per second:    2102.27 [#/sec] (mean)
Time per request:       47.568 [ms] (mean)
Time per request:       0.476 [ms] (mean, across all concurrent requests)
Transfer rate:          2152920.42 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      1       6
Processing:     5   47   8.5     47      88
Waiting:        0   14  14.6      8      54
Total:          8   47   8.5     48      88

Percentage of the requests served within a certain time (ms)
  50%     48
  66%     50
  75%     52
  80%     53
  90%     57
  95%     62
  98%     67
  99%     71
 100%     88 (longest request)

procfs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ cat /proc/`pgrep -lf 'martini_server' | awk '{print $1}'`/status
Name: martini_server
State:    S (sleeping)
Tgid: 14745
Pid:  14745
PPid: 6925
TracerPid:    0
Uid:  1000    1000    1000    1000
Gid:  1000    1000    1000    1000
FDSize:   256
Groups:   4 24 27 30 46 108 109 1000
VmPeak:     242100 kB
VmSize:     185852 kB
VmLck:           0 kB
VmPin:           0 kB
VmHWM:        9064 kB
VmRSS:        9064 kB
VmData:     174376 kB
VmStk:         140 kB
VmExe:        1632 kB
VmLib:        2012 kB
VmPTE:          80 kB
VmSwap:          0 kB
Threads:  5
SigQ: 0/63671
SigPnd:   0000000000000000
ShdPnd:   0000000000000000
SigBlk:   0000000000000000
SigIgn:   0000000000000000
SigCgt:   ffffffffffc1feff
CapInh:   0000000000000000
CapPrm:   0000000000000000
CapEff:   0000000000000000
CapBnd:   0000001fffffffff
Seccomp:  0
Cpus_allowed: ffffffff,ffffffff
Cpus_allowed_list:    0-63
Mems_allowed: 00000000,00000001
Mems_allowed_list:    0
voluntary_ctxt_switches:  985
nonvoluntary_ctxt_switches:   17704

Node.js

結果

ab


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
$ ab -c 100 -n 10000 http://localhost:8000/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
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)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:
Server Hostname:        localhost
Server Port:            8000

Document Path:          /
Document Length:        1048576 bytes

Concurrency Level:      100
Time taken for tests:   4.346 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      10486510000 bytes
HTML transferred:       10485760000 bytes
Requests per second:    2300.74 [#/sec] (mean)
Time per request:       43.464 [ms] (mean)
Time per request:       0.435 [ms] (mean, across all concurrent requests)
Transfer rate:          2356128.80 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      1       5
Processing:    16   43   6.2     45      60
Waiting:        0   14  12.9     13      41
Total:         17   43   6.5     46      60
ERROR: The median and mean for the initial connection time are more than twice the standard
       deviation apart. These results are NOT reliable.

Percentage of the requests served within a certain time (ms)
  50%     46
  66%     49
  75%     49
  80%     49
  90%     50
  95%     51
  98%     54
  99%     55
 100%     60 (longest request)

procfs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ cat /proc/`pgrep -lf 'nodejs node_server.js' | awk '{print $1}'`/status
Name: nodejs
State:    S (sleeping)
Tgid: 14860
Pid:  14860
PPid: 6925
TracerPid:    0
Uid:  1000    1000    1000    1000
Gid:  1000    1000    1000    1000
FDSize:   256
Groups:   4 24 27 30 46 108 109 1000
VmPeak:     720076 kB
VmSize:     672132 kB
VmLck:           0 kB
VmPin:           0 kB
VmHWM:       56892 kB
VmRSS:       56892 kB
VmData:     645248 kB
VmStk:         140 kB
VmExe:        8132 kB
VmLib:        4168 kB
VmPTE:         264 kB
VmSwap:          0 kB
Threads:  2
SigQ: 0/63671
SigPnd:   0000000000000000
ShdPnd:   0000000000000000
SigBlk:   0000000000000000
SigIgn:   0000000000001000
SigCgt:   0000000188004202
CapInh:   0000000000000000
CapPrm:   0000000000000000
CapEff:   0000000000000000
CapBnd:   0000001fffffffff
Seccomp:  0
Cpus_allowed: ffffffff,ffffffff
Cpus_allowed_list:    0-63
Mems_allowed: 00000000,00000001
Mems_allowed_list:    0
voluntary_ctxt_switches:  6389
nonvoluntary_ctxt_switches:   7180

Scala/Finagle

結果

起動スクリプト

sbt-assemblyで固めて実行。

1
java -jar ./target/scala-2.10/FinageBenchmark-assembly-1.0.jar

ab


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$ ab -c 100 -n 10000 http://localhost:8000/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
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)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:
Server Hostname:        localhost
Server Port:            8000

Document Path:          /
Document Length:        1048576 bytes

Concurrency Level:      100
Time taken for tests:   7.682 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      10485950000 bytes
HTML transferred:       10485760000 bytes
Requests per second:    1301.69 [#/sec] (mean)
Time per request:       76.823 [ms] (mean)
Time per request:       0.768 [ms] (mean, across all concurrent requests)
Transfer rate:          1332958.99 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      1       5
Processing:     7   75   5.9     75     153
Waiting:        1    3   4.4      2      82
Total:         11   77   5.9     76     155

Percentage of the requests served within a certain time (ms)
  50%     76
  66%     77
  75%     78
  80%     79
  90%     80
  95%     82
  98%     86
  99%     92
 100%    155 (longest request)

procfs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ cat /proc/`pgrep -lf 'FinageBenchmark-assembly-1.0.jar' | awk '{print $1}'`/status
Name: java
State:    S (sleeping)
Tgid: 15132
Pid:  15132
PPid: 15017
TracerPid:    0
Uid:  1000    1000    1000    1000
Gid:  1000    1000    1000    1000
FDSize:   256
Groups:   4 24 27 30 46 108 109 1000
VmPeak:    3993828 kB
VmSize:    3936516 kB
VmLck:           0 kB
VmPin:           0 kB
VmHWM:      807656 kB
VmRSS:      726864 kB
VmData:    3878388 kB
VmStk:         140 kB
VmExe:           4 kB
VmLib:       15552 kB
VmPTE:        1868 kB
VmSwap:          0 kB
Threads:  25
SigQ: 0/63671
SigPnd:   0000000000000000
ShdPnd:   0000000000000000
SigBlk:   0000000000000000
SigIgn:   0000000000000000
SigCgt:   2000000181005ccf
CapInh:   0000000000000000
CapPrm:   0000000000000000
CapEff:   0000000000000000
CapBnd:   0000001fffffffff
Seccomp:  0
Cpus_allowed: ffffffff,ffffffff
Cpus_allowed_list:    0-63
Mems_allowed: 00000000,00000001
Mems_allowed_list:    0
voluntary_ctxt_switches:  5
nonvoluntary_ctxt_switches:   6

Scala/Spray

結果

起動スクリプト

sbt-assemblyで固めて実行。

1
java -jar ./target/scala-2.10/spray_benchmark-assembly-0.1.jar

ab


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$ ab -c 100 -n 10000 http://localhost:8000/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
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)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        spray-can/1.1.0
Server Hostname:        localhost
Server Port:            8000

Document Path:          /
Document Length:        1048576 bytes

Concurrency Level:      100
Time taken for tests:   6.184 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      10487070000 bytes
HTML transferred:       10485760000 bytes
Requests per second:    1617.00 [#/sec] (mean)
Time per request:       61.843 [ms] (mean)
Time per request:       0.618 [ms] (mean, across all concurrent requests)
Transfer rate:          1656013.76 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.4      1       5
Processing:     7   61   8.4     60     105
Waiting:        1    6   7.2      3      52
Total:         11   62   8.4     61     106

Percentage of the requests served within a certain time (ms)
  50%     61
  66%     63
  75%     65
  80%     66
  90%     70
  95%     76
  98%     82
  99%     85
 100%    106 (longest request)

procfs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
$ cat /proc/`pgrep -lf 'spray_benchmark-assembly-0.1.jar' | awk '{print $1}'`/status
Name: java
State:    S (sleeping)
Tgid: 15264
Pid:  15264
PPid: 15017
TracerPid:    0
Uid:  1000    1000    1000    1000
Gid:  1000    1000    1000    1000
FDSize:   256
Groups:   4 24 27 30 46 108 109 1000
VmPeak:    4130404 kB
VmSize:    4130400 kB
VmLck:           0 kB
VmPin:           0 kB
VmHWM:      833040 kB
VmRSS:      832932 kB
VmData:    4069920 kB
VmStk:         140 kB
VmExe:           4 kB
VmLib:       15804 kB
VmPTE:        1948 kB
VmSwap:          0 kB
Threads:  22
SigQ: 0/63671
SigPnd:   0000000000000000
ShdPnd:   0000000000000000
SigBlk:   0000000000000000
SigIgn:   0000000000000000
SigCgt:   2000000181005ccf
CapInh:   0000000000000000
CapPrm:   0000000000000000
CapEff:   0000000000000000
CapBnd:   0000001fffffffff
Seccomp:  0
Cpus_allowed: ffffffff,ffffffff
Cpus_allowed_list:    0-63
Mems_allowed: 00000000,00000001
Mems_allowed_list:    0
voluntary_ctxt_switches:  5
nonvoluntary_ctxt_switches:   2