Submit Search
Rubyで実はwritev(2) が使われているはなし
5 likes
7,844 views
Masaki Matsushita
大江戸Ruby会議05で発表した内容です
Engineering
Read more
1 of 9
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
More Related Content
PDF
CouchDB JP & BigCouch
Yohei Sasaki
PDF
最近のRust関連の活動
Hattori Hideo
PDF
Pd Kai#3 Startup Process
nagachika t
PDF
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
PPTX
RgGen ご紹介
Taichi Ishitani
PDF
Mono is Dead
melpon
PDF
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
Fuminobu Takeyama
PPTX
C++のビルド高速化について
AimingStudy
CouchDB JP & BigCouch
Yohei Sasaki
最近のRust関連の活動
Hattori Hideo
Pd Kai#3 Startup Process
nagachika t
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
RgGen ご紹介
Taichi Ishitani
Mono is Dead
melpon
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
Fuminobu Takeyama
C++のビルド高速化について
AimingStudy
What's hot
(20)
PDF
MenohにおけるC++実装 / C API / C++API
Shintarou Okada
PDF
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
洋史 東平
PDF
分散バージョン管理システムって何なん 20101218
Takashi Okamoto
PDF
Tinkerer for pyfes 201303
shirou wakayama
PDF
Raspberry Pi + Go で IoT した話
yaegashi
PDF
git-svnつかってみる?
riskrisk
ODP
Lispmeetup11
blackenedgold
PDF
js-ctypes - ネイティブコードを呼び出す新しいカタチ
Makoto Kato
PDF
Boost sg msgpack
Takatoshi Kondo
PDF
20161106 osc-tokyo-command-line
Fuminobu Takeyama
PDF
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
Fuminobu Takeyama
PDF
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
Fuminobu Takeyama
PPTX
Rustのテストやエコシステム
KiyotomoHiroyasu
PPTX
CppCon2016 report and Boost.SML
Takatoshi Kondo
PDF
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
ShunsukeNakamura17
PDF
Ruby on RedHat Enterprise Linux
Tomoya Kawanishi
PDF
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
Fuminobu Takeyama
PPTX
UniRx勉強会 reactive extensions inside(公開用)
wilfrem
PDF
OSC2016 Tokyo/Spring セミナー資料
slankdev
PPT
Gr sakuraでtinet
Kazuhiro Takahashi
MenohにおけるC++実装 / C API / C++API
Shintarou Okada
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
洋史 東平
分散バージョン管理システムって何なん 20101218
Takashi Okamoto
Tinkerer for pyfes 201303
shirou wakayama
Raspberry Pi + Go で IoT した話
yaegashi
git-svnつかってみる?
riskrisk
Lispmeetup11
blackenedgold
js-ctypes - ネイティブコードを呼び出す新しいカタチ
Makoto Kato
Boost sg msgpack
Takatoshi Kondo
20161106 osc-tokyo-command-line
Fuminobu Takeyama
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
Fuminobu Takeyama
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
Fuminobu Takeyama
Rustのテストやエコシステム
KiyotomoHiroyasu
CppCon2016 report and Boost.SML
Takatoshi Kondo
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
ShunsukeNakamura17
Ruby on RedHat Enterprise Linux
Tomoya Kawanishi
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
Fuminobu Takeyama
UniRx勉強会 reactive extensions inside(公開用)
wilfrem
OSC2016 Tokyo/Spring セミナー資料
slankdev
Gr sakuraでtinet
Kazuhiro Takahashi
Ad
Viewers also liked
(20)
PDF
SQL 脳から見た Ruby
yancya
PDF
Ember コミュニティとわたし
Ryunosuke SATO
PDF
WebSocket For Web Rubyists
Mu-Fan Teng
PDF
mruby で mackerel のプラグインを作るはなし
Hiroshi SHIBATA
PDF
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
mametter
PDF
NTT Tech Conference #1 Opening Keynote
NTT Communications Technology Development
PDF
Learning to forget continual prediction with lstm
Fujimoto Keisuke
PPT
Urban Hacks
yuiseki yuiseki
PPT
think ecogeek
yuiseki yuiseki
PDF
RubyWorld Conference 2012 へ何で行ったのか
yancya
PDF
BigQuery の relation 生成
yancya
PDF
ライブ中継サービスと機材について
Yoshiki Mizushima
PDF
TPAC 2015 WebRTC WG 最新レポート
NTT Communications Technology Development
PDF
OpsからみたOpenStack Summit
NTT Communications Technology Development
PDF
Collect, summarize and notify of OpenStack's log
NTT Communications Technology Development
PDF
Security Advisories Checker on Travis/Circle CI
Ryo Shibayama
PDF
ツイートID生成とツイッターリアルタイム検索システムの話
Preferred Networks
PDF
Ruby meets Go
NTT Communications Technology Development
PDF
BigQueryのちょっとした話 #phpblt
kunit
PDF
RabbitMQ can scale out!!(jp ops-workshop-3)
NTT Communications Technology Development
SQL 脳から見た Ruby
yancya
Ember コミュニティとわたし
Ryunosuke SATO
WebSocket For Web Rubyists
Mu-Fan Teng
mruby で mackerel のプラグインを作るはなし
Hiroshi SHIBATA
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
mametter
NTT Tech Conference #1 Opening Keynote
NTT Communications Technology Development
Learning to forget continual prediction with lstm
Fujimoto Keisuke
Urban Hacks
yuiseki yuiseki
think ecogeek
yuiseki yuiseki
RubyWorld Conference 2012 へ何で行ったのか
yancya
BigQuery の relation 生成
yancya
ライブ中継サービスと機材について
Yoshiki Mizushima
TPAC 2015 WebRTC WG 最新レポート
NTT Communications Technology Development
OpsからみたOpenStack Summit
NTT Communications Technology Development
Collect, summarize and notify of OpenStack's log
NTT Communications Technology Development
Security Advisories Checker on Travis/Circle CI
Ryo Shibayama
ツイートID生成とツイッターリアルタイム検索システムの話
Preferred Networks
Ruby meets Go
NTT Communications Technology Development
BigQueryのちょっとした話 #phpblt
kunit
RabbitMQ can scale out!!(jp ops-workshop-3)
NTT Communications Technology Development
Ad
Similar to Rubyで実はwritev(2) が使われているはなし
(20)
KEY
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
PDF
RISC-V User level ISA
たけおか しょうぞう
PDF
謎の言語Forthが謎なので実装した
t-sin
PDF
スタート低レイヤー #0
Kiwamu Okabe
PDF
らくちん Go言語
株式会社YEBIS.XYZ
PDF
20130824 Lightweight Language "Go" @LL matsuri
Yoshifumi Yamaguchi
PDF
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
inaz2
PPTX
VAEで遊んでみる
超史 宮崎
PDF
第2回勉強会スライド
koturn 0;
PDF
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
Jun-ichi Sakamoto
PDF
Unix
Hiramatsu Ryosuke
PDF
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
PPTX
20170527 inside .NET Core on Linux
Takayoshi Tanaka
PDF
ソフトウェア工学2023 14 ビルド
Toru Tamaki
PDF
Bossan dentoo
kubo39
PPTX
20130316 プログラミング言語Go
Yoshifumi Yamaguchi
PPTX
Alt#0x008 2017/5/20
Koki Natsume
PDF
ゲームのインフラをAwsで実戦tips全て見せます
infinite_loop
PPTX
KubeCon EU報告(ランタイム関連,イメージ関連)
Akihiro Suda
PDF
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
hiyohiyo
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
RISC-V User level ISA
たけおか しょうぞう
謎の言語Forthが謎なので実装した
t-sin
スタート低レイヤー #0
Kiwamu Okabe
らくちん Go言語
株式会社YEBIS.XYZ
20130824 Lightweight Language "Go" @LL matsuri
Yoshifumi Yamaguchi
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
inaz2
VAEで遊んでみる
超史 宮崎
第2回勉強会スライド
koturn 0;
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
Jun-ichi Sakamoto
Unix
Hiramatsu Ryosuke
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
20170527 inside .NET Core on Linux
Takayoshi Tanaka
ソフトウェア工学2023 14 ビルド
Toru Tamaki
Bossan dentoo
kubo39
20130316 プログラミング言語Go
Yoshifumi Yamaguchi
Alt#0x008 2017/5/20
Koki Natsume
ゲームのインフラをAwsで実戦tips全て見せます
infinite_loop
KubeCon EU報告(ランタイム関連,イメージ関連)
Akihiro Suda
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
hiyohiyo
Rubyで実はwritev(2) が使われているはなし
1.
Rubyで実はwritev(2) が使われているはなし 2015年11月7日 松下 正樹
2.
自己紹介 ● 松下 正樹 ○ svn:
glass, twitter: @_mmasaki, github: mmasaki ● NTTコミュニケーションズ ● 136 commits for Ruby ○ 高速化: String#include?, Hash#flatten. Marshal.load ● 16 commits for OpenStack (Liberty) ○ “I like Python too.”と書いたらCFP通ったので OpenStack Summit Tokyoで発表
3.
知らない間に使われているwritev(2) # 書き込みバッファのサイズは8192バイト str =
"a" * 5000 File.open("foo", "w") do |f| f.write(str) # 書き込みバッファに収まる f.write(str) # 収まらない! end ● 下記のコードではwrite(2)が2回呼ばれ…ない ● writev(2)が1回だけ呼ばれる
4.
writev(2)とは? ● 複数のバッファの内容をアトミックに 書き込めるかもしれないシステムコール ○ write(2)同様バッファを全て書き込めるとは限らない struct
iovec { void *iov_base; size_t iov_len; }; struct iovec vector[2]; /* 2つのバッファを書き出す例 */ vector[0].iov_base = buf1; vector[0].iov_len = strlen(buf1); vector[1].iov_base = buf2; vector[1].iov_len = strlen(buf2); writev(1, vector, 2);
5.
RubyのIO typedef struct rb_io_t
{ FILE *stdio_file; int fd; /* file descriptor */ int mode; /* mode */ (中略) rb_io_buffer_t wbuf, rbuf; (後略) } struct rb_io_buffer_t { char *ptr; int off; int len; int capa; } ● stdioを使わず直接システムコールを使っている ● ruby自身が読み書きのバッファを持つ
6.
IO#writeの大まかな流れ (io.c) IO#writeの呼び出し ↓ io_write(): レシーバがIOかどうか、IOが書き込み可能かのチェック io_fwrite():
文字コード変換とStringのfreeze ↓ io_binwrite(): 書き込みバッファに溜め込む ↓ io_binwrite_string(): 書き込みバッファが溢れると呼ばれる ↓ write(2) or writev(2)
7.
io_binwrite_string()の実装: writev(2)導入前 if (書き込みバッファの中身がある)
{ if (渡されたバイト列がバッファに収まる) { if (バッファを詰めれば収まる) { 頑張って詰める; } バイト列を書き込みバッファに収める; } io_fflush(fptr); /* 中でwrite(2)が呼ばれる */ } rb_write_internal(p->fptr->fd, p->ptr, p->length);
8.
io_binwrite_string()の実装: writev(2)導入後 struct iovec
iov[2]; /* iov[0]: 書き込みバッファ */ iov[0].iov_base = fptr->wbuf.ptr+fptr->wbuf.off; iov[0].iov_len = fptr->wbuf.len; /* iov[1]: 書き込みバッファに収まらなかったバイト列 */ iov[1].iov_base = (char *)p->ptr; iov[1].iov_len = p->length; r = rb_writev_internal(fptr->fd, iov, 2);
9.
まとめ ● RubyのIOはstdioを使わず自前でシステムコールを叩く ● RubyのIOではwritev(2)が使われている ●
writev(2)は、複数のバッファをアトミックに書き込む ○ write(2)同様成功するとは限らない ● writev(2)の導入によって ○ システムコール呼び出し回数を減らすことができる ○ バッファの中身と渡されたStringをアトミックに 書き出せる(かもしれない)
Download