Submit Search
Upload
Rubyで実はwritev(2) が使われているはなし
•
5 likes
•
7,818 views
Masaki Matsushita
Follow
大江戸Ruby会議05で発表した内容です
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 9
Download now
Download to read offline
Recommended
CouchDB JP & BigCouch
CouchDB JP & BigCouch
Yohei Sasaki
最近のRust関連の活動
最近のRust関連の活動
Hattori Hideo
Pd Kai#3 Startup Process
Pd Kai#3 Startup Process
nagachika t
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
RgGen ご紹介
RgGen ご紹介
Taichi Ishitani
Mono is Dead
Mono is Dead
melpon
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
Fuminobu Takeyama
C++のビルド高速化について
C++のビルド高速化について
AimingStudy
Recommended
CouchDB JP & BigCouch
CouchDB JP & BigCouch
Yohei Sasaki
最近のRust関連の活動
最近のRust関連の活動
Hattori Hideo
Pd Kai#3 Startup Process
Pd Kai#3 Startup Process
nagachika t
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
Yoshifumi Kawai
RgGen ご紹介
RgGen ご紹介
Taichi Ishitani
Mono is Dead
Mono is Dead
melpon
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
Fuminobu Takeyama
C++のビルド高速化について
C++のビルド高速化について
AimingStudy
MenohにおけるC++実装 / C API / C++API
MenohにおけるC++実装 / C API / C++API
Shintarou Okada
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
洋史 東平
分散バージョン管理システムって何なん 20101218
分散バージョン管理システムって何なん 20101218
Takashi Okamoto
Tinkerer for pyfes 201303
Tinkerer for pyfes 201303
shirou wakayama
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話
yaegashi
git-svnつかってみる?
git-svnつかってみる?
riskrisk
Lispmeetup11
Lispmeetup11
blackenedgold
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチ
Makoto Kato
Boost sg msgpack
Boost sg msgpack
Takatoshi Kondo
20161106 osc-tokyo-command-line
20161106 osc-tokyo-command-line
Fuminobu Takeyama
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
Fuminobu Takeyama
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
Fuminobu Takeyama
Rustのテストやエコシステム
Rustのテストやエコシステム
KiyotomoHiroyasu
CppCon2016 report and Boost.SML
CppCon2016 report and Boost.SML
Takatoshi Kondo
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
ShunsukeNakamura17
Ruby on RedHat Enterprise Linux
Ruby on RedHat Enterprise Linux
Tomoya Kawanishi
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
Fuminobu Takeyama
UniRx勉強会 reactive extensions inside(公開用)
UniRx勉強会 reactive extensions inside(公開用)
wilfrem
OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料
slankdev
Gr sakuraでtinet
Gr sakuraでtinet
Kazuhiro Takahashi
SQL 脳から見た Ruby
SQL 脳から見た Ruby
yancya
Ember コミュニティとわたし
Ember コミュニティとわたし
Ryunosuke SATO
More Related Content
What's hot
MenohにおけるC++実装 / C API / C++API
MenohにおけるC++実装 / C API / C++API
Shintarou Okada
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
洋史 東平
分散バージョン管理システムって何なん 20101218
分散バージョン管理システムって何なん 20101218
Takashi Okamoto
Tinkerer for pyfes 201303
Tinkerer for pyfes 201303
shirou wakayama
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話
yaegashi
git-svnつかってみる?
git-svnつかってみる?
riskrisk
Lispmeetup11
Lispmeetup11
blackenedgold
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチ
Makoto Kato
Boost sg msgpack
Boost sg msgpack
Takatoshi Kondo
20161106 osc-tokyo-command-line
20161106 osc-tokyo-command-line
Fuminobu Takeyama
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
Fuminobu Takeyama
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
Fuminobu Takeyama
Rustのテストやエコシステム
Rustのテストやエコシステム
KiyotomoHiroyasu
CppCon2016 report and Boost.SML
CppCon2016 report and Boost.SML
Takatoshi Kondo
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
ShunsukeNakamura17
Ruby on RedHat Enterprise Linux
Ruby on RedHat Enterprise Linux
Tomoya Kawanishi
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
Fuminobu Takeyama
UniRx勉強会 reactive extensions inside(公開用)
UniRx勉強会 reactive extensions inside(公開用)
wilfrem
OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料
slankdev
Gr sakuraでtinet
Gr sakuraでtinet
Kazuhiro Takahashi
What's hot
(20)
MenohにおけるC++実装 / C API / C++API
MenohにおけるC++実装 / C API / C++API
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
分散バージョン管理システムって何なん 20101218
分散バージョン管理システムって何なん 20101218
Tinkerer for pyfes 201303
Tinkerer for pyfes 201303
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話
git-svnつかってみる?
git-svnつかってみる?
Lispmeetup11
Lispmeetup11
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチ
Boost sg msgpack
Boost sg msgpack
20161106 osc-tokyo-command-line
20161106 osc-tokyo-command-line
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
Rustのテストやエコシステム
Rustのテストやエコシステム
CppCon2016 report and Boost.SML
CppCon2016 report and Boost.SML
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
Ruby on RedHat Enterprise Linux
Ruby on RedHat Enterprise Linux
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
UniRx勉強会 reactive extensions inside(公開用)
UniRx勉強会 reactive extensions inside(公開用)
OSC2016 Tokyo/Spring セミナー資料
OSC2016 Tokyo/Spring セミナー資料
Gr sakuraでtinet
Gr sakuraでtinet
Viewers also liked
SQL 脳から見た Ruby
SQL 脳から見た Ruby
yancya
Ember コミュニティとわたし
Ember コミュニティとわたし
Ryunosuke SATO
WebSocket For Web Rubyists
WebSocket For Web Rubyists
Mu-Fan Teng
mruby で mackerel のプラグインを作るはなし
mruby で mackerel のプラグインを作るはなし
Hiroshi SHIBATA
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
mametter
NTT Tech Conference #1 Opening Keynote
NTT Tech Conference #1 Opening Keynote
NTT Communications Technology Development
Learning to forget continual prediction with lstm
Learning to forget continual prediction with lstm
Fujimoto Keisuke
Urban Hacks
Urban Hacks
yuiseki yuiseki
think ecogeek
think ecogeek
yuiseki yuiseki
RubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのか
yancya
BigQuery の relation 生成
BigQuery の relation 生成
yancya
ライブ中継サービスと機材について
ライブ中継サービスと機材について
Yoshiki Mizushima
TPAC 2015 WebRTC WG 最新レポート
TPAC 2015 WebRTC WG 最新レポート
NTT Communications Technology Development
OpsからみたOpenStack Summit
OpsからみたOpenStack Summit
NTT Communications Technology Development
Collect, summarize and notify of OpenStack's log
Collect, summarize and notify of OpenStack's log
NTT Communications Technology Development
Security Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CI
Ryo Shibayama
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
Preferred Networks
Ruby meets Go
Ruby meets Go
NTT Communications Technology Development
BigQueryのちょっとした話 #phpblt
BigQueryのちょっとした話 #phpblt
kunit
RabbitMQ can scale out!!(jp ops-workshop-3)
RabbitMQ can scale out!!(jp ops-workshop-3)
NTT Communications Technology Development
Viewers also liked
(20)
SQL 脳から見た Ruby
SQL 脳から見た Ruby
Ember コミュニティとわたし
Ember コミュニティとわたし
WebSocket For Web Rubyists
WebSocket For Web Rubyists
mruby で mackerel のプラグインを作るはなし
mruby で mackerel のプラグインを作るはなし
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
NTT Tech Conference #1 Opening Keynote
NTT Tech Conference #1 Opening Keynote
Learning to forget continual prediction with lstm
Learning to forget continual prediction with lstm
Urban Hacks
Urban Hacks
think ecogeek
think ecogeek
RubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのか
BigQuery の relation 生成
BigQuery の relation 生成
ライブ中継サービスと機材について
ライブ中継サービスと機材について
TPAC 2015 WebRTC WG 最新レポート
TPAC 2015 WebRTC WG 最新レポート
OpsからみたOpenStack Summit
OpsからみたOpenStack Summit
Collect, summarize and notify of OpenStack's log
Collect, summarize and notify of OpenStack's log
Security Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CI
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
Ruby meets Go
Ruby meets Go
BigQueryのちょっとした話 #phpblt
BigQueryのちょっとした話 #phpblt
RabbitMQ can scale out!!(jp ops-workshop-3)
RabbitMQ can scale out!!(jp ops-workshop-3)
Similar to Rubyで実はwritev(2) が使われているはなし
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
RISC-V User level ISA
RISC-V User level ISA
たけおか しょうぞう
謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した
t-sin
スタート低レイヤー #0
スタート低レイヤー #0
Kiwamu Okabe
らくちん Go言語
らくちん Go言語
株式会社YEBIS.XYZ
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri
Yoshifumi Yamaguchi
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
inaz2
VAEで遊んでみる
VAEで遊んでみる
超史 宮崎
第2回勉強会スライド
第2回勉強会スライド
koturn 0;
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
Jun-ichi Sakamoto
Unix
Unix
Hiramatsu Ryosuke
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
20170527 inside .NET Core on Linux
20170527 inside .NET Core on Linux
Takayoshi Tanaka
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
Toru Tamaki
Bossan dentoo
Bossan dentoo
kubo39
20130316 プログラミング言語Go
20130316 プログラミング言語Go
Yoshifumi Yamaguchi
Alt#0x008 2017/5/20
Alt#0x008 2017/5/20
Koki Natsume
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
infinite_loop
KubeCon EU報告(ランタイム関連,イメージ関連)
KubeCon EU報告(ランタイム関連,イメージ関連)
Akihiro Suda
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
hiyohiyo
Similar to Rubyで実はwritev(2) が使われているはなし
(20)
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
RISC-V User level ISA
RISC-V User level ISA
謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した
スタート低レイヤー #0
スタート低レイヤー #0
らくちん Go言語
らくちん Go言語
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
VAEで遊んでみる
VAEで遊んでみる
第2回勉強会スライド
第2回勉強会スライド
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
Unix
Unix
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
20170527 inside .NET Core on Linux
20170527 inside .NET Core on Linux
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
Bossan dentoo
Bossan dentoo
20130316 プログラミング言語Go
20130316 プログラミング言語Go
Alt#0x008 2017/5/20
Alt#0x008 2017/5/20
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
KubeCon EU報告(ランタイム関連,イメージ関連)
KubeCon EU報告(ランタイム関連,イメージ関連)
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
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 now