SlideShare a Scribd company logo
Rubyで実はwritev(2)
が使われているはなし
2015年11月7日
松下 正樹
自己紹介
● 松下 正樹
○ 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で発表
知らない間に使われている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回だけ呼ばれる
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);
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自身が読み書きのバッファを持つ
IO#writeの大まかな流れ (io.c)
IO#writeの呼び出し
↓
io_write(): レシーバがIOかどうか、IOが書き込み可能かのチェック
io_fwrite(): 文字コード変換とStringのfreeze
↓
io_binwrite(): 書き込みバッファに溜め込む
↓
io_binwrite_string(): 書き込みバッファが溢れると呼ばれる
↓
write(2) or writev(2)
io_binwrite_string()の実装: writev(2)導入前
if (書き込みバッファの中身がある) {
if (渡されたバイト列がバッファに収まる) {
if (バッファを詰めれば収まる) { 頑張って詰める; }
バイト列を書き込みバッファに収める;
}
io_fflush(fptr); /* 中でwrite(2)が呼ばれる */
}
rb_write_internal(p->fptr->fd, p->ptr, p->length);
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);
まとめ
● RubyのIOはstdioを使わず自前でシステムコールを叩く
● RubyのIOではwritev(2)が使われている
● writev(2)は、複数のバッファをアトミックに書き込む
○ write(2)同様成功するとは限らない
● writev(2)の導入によって
○ システムコール呼び出し回数を減らすことができる
○ バッファの中身と渡されたStringをアトミックに
書き出せる(かもしれない)

More Related Content

PDF
CouchDB JP & BigCouch
PDF
最近のRust関連の活動
PDF
Pd Kai#3 Startup Process
PDF
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
PPTX
RgGen ご紹介
PDF
Mono is Dead
PDF
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
PPTX
C++のビルド高速化について
CouchDB JP & BigCouch
最近のRust関連の活動
Pd Kai#3 Startup Process
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
RgGen ご紹介
Mono is Dead
今さら聞けない― Linuxコマンドラインツールテクニック (導入編)
C++のビルド高速化について

What's hot (20)

PDF
MenohにおけるC++実装 / C API / C++API
PDF
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
PDF
分散バージョン管理システムって何なん 20101218
PDF
Tinkerer for pyfes 201303
PDF
Raspberry Pi + Go で IoT した話
PDF
git-svnつかってみる?
ODP
Lispmeetup11
PDF
js-ctypes - ネイティブコードを呼び出す新しいカタチ
PDF
Boost sg msgpack
PDF
20161106 osc-tokyo-command-line
PDF
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
PDF
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
PPTX
Rustのテストやエコシステム
PPTX
CppCon2016 report and Boost.SML
PDF
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
PDF
Ruby on RedHat Enterprise Linux
PDF
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
PPTX
UniRx勉強会 reactive extensions inside(公開用)
PDF
OSC2016 Tokyo/Spring セミナー資料
PPT
Gr sakuraでtinet
MenohにおけるC++実装 / C API / C++API
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
分散バージョン管理システムって何なん 20101218
Tinkerer for pyfes 201303
Raspberry Pi + Go で IoT した話
git-svnつかってみる?
Lispmeetup11
js-ctypes - ネイティブコードを呼び出す新しいカタチ
Boost sg msgpack
20161106 osc-tokyo-command-line
サーバーだけじゃない!Linux デスクトップを使い倒そう その3 ― 今話題の Kotlin から Ruby、C++ 1x…の開発環境を整える
今さら聞けない! Linux コマンドラインツールテクニック その1 rev. 3
Rustのテストやエコシステム
CppCon2016 report and Boost.SML
俺の let p = PathBuf::from("/test").into_os_string().to_str();はなぜコンパイルエラーか
Ruby on RedHat Enterprise Linux
Ruby でできていると言っても過言ではない Linux ディストリビューション―openSUSE
UniRx勉強会 reactive extensions inside(公開用)
OSC2016 Tokyo/Spring セミナー資料
Gr sakuraでtinet
Ad

Viewers also liked (20)

PDF
SQL 脳から見た Ruby
PDF
Ember コミュニティとわたし
PDF
WebSocket For Web Rubyists
PDF
mruby で mackerel のプラグインを作るはなし
PDF
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
PDF
NTT Tech Conference #1 Opening Keynote
PDF
Learning to forget continual prediction with lstm
PPT
Urban Hacks
PPT
think ecogeek
PDF
RubyWorld Conference 2012 へ何で行ったのか
PDF
BigQuery の relation 生成
PDF
ライブ中継サービスと機材について
PDF
TPAC 2015 WebRTC WG 最新レポート
PDF
OpsからみたOpenStack Summit
PDF
Collect, summarize and notify of OpenStack's log
PDF
Security Advisories Checker on Travis/Circle CI
PDF
ツイートID生成とツイッターリアルタイム検索システムの話
PDF
BigQueryのちょっとした話 #phpblt
PDF
RabbitMQ can scale out!!(jp ops-workshop-3)
SQL 脳から見た Ruby
Ember コミュニティとわたし
WebSocket For Web Rubyists
mruby で mackerel のプラグインを作るはなし
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
NTT Tech Conference #1 Opening Keynote
Learning to forget continual prediction with lstm
Urban Hacks
think ecogeek
RubyWorld Conference 2012 へ何で行ったのか
BigQuery の relation 生成
ライブ中継サービスと機材について
TPAC 2015 WebRTC WG 最新レポート
OpsからみたOpenStack Summit
Collect, summarize and notify of OpenStack's log
Security Advisories Checker on Travis/Circle CI
ツイートID生成とツイッターリアルタイム検索システムの話
BigQueryのちょっとした話 #phpblt
RabbitMQ can scale out!!(jp ops-workshop-3)
Ad

Similar to Rubyで実はwritev(2) が使われているはなし (20)

KEY
関東GPGPU勉強会 LLVM meets GPU
PDF
RISC-V User level ISA
PDF
謎の言語Forthが謎なので実装した
PDF
スタート低レイヤー #0
PDF
らくちん Go言語
PDF
20130824 Lightweight Language "Go" @LL matsuri
PDF
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
PPTX
VAEで遊んでみる
PDF
第2回勉強会スライド
PDF
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
PDF
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
PPTX
20170527 inside .NET Core on Linux
PDF
ソフトウェア工学2023 14 ビルド
PDF
Bossan dentoo
PPTX
20130316 プログラミング言語Go
PPTX
Alt#0x008 2017/5/20
PDF
ゲームのインフラをAwsで実戦tips全て見せます
PPTX
KubeCon EU報告(ランタイム関連,イメージ関連)
PDF
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
関東GPGPU勉強会 LLVM meets GPU
RISC-V User level ISA
謎の言語Forthが謎なので実装した
スタート低レイヤー #0
らくちん Go言語
20130824 Lightweight Language "Go" @LL matsuri
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
VAEで遊んでみる
第2回勉強会スライド
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
20170527 inside .NET Core on Linux
ソフトウェア工学2023 14 ビルド
Bossan dentoo
20130316 プログラミング言語Go
Alt#0x008 2017/5/20
ゲームのインフラをAwsで実戦tips全て見せます
KubeCon EU報告(ランタイム関連,イメージ関連)
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。

Rubyで実はwritev(2) が使われているはなし