• 検索結果がありません。

自 己 紹 介 冨 田 昌 宏 ( 株 ) 富 士 通 システムズ イースト 長 野 勤 務 OSS 推 進 フォーラム アプリケーション 部 会 に 参 加 1998 年 から 個 人 的 にRubyを 使 用 2003 年 からRubyで 製 品 開 発

N/A
N/A
Protected

Academic year: 2021

シェア "自 己 紹 介 冨 田 昌 宏 ( 株 ) 富 士 通 システムズ イースト 長 野 勤 務 OSS 推 進 フォーラム アプリケーション 部 会 に 参 加 1998 年 から 個 人 的 にRubyを 使 用 2003 年 からRubyで 製 品 開 発"

Copied!
38
0
0

読み込み中.... (全文を見る)

全文

(1)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

非Railsアプリのマルチデータベース

対応と高速化の取り組み

(株)富士通システムズ・イースト

冨田昌宏

2015-11-12

RubyWorld Conference

(2)

自己紹介

冨田昌宏

(株)富士通システムズ・イースト

長野勤務

OSS推進フォーラム アプリケーション部会に参加

1998年から個人的にRubyを使用

2003年からRubyで製品開発

(3)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

SYNCDOT

メールソリューション製品群

Webメール / SMTP /POP / IMAPサーバー

メールフィルター / メールアーカイブ

実行時使用OSS

Ruby / Apache / Postfix / MySQL

開発時使用OSS

Git / Redmine / Jenkins / Docker / RSpec /

Cucumber

(4)

非Railsアプリのマルチデータベース

対応と高速化の取り組み

(5)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

「非Rails」

2003年から開発開始 〜 Rails以前

主な機能はメール処理。ウェブは補助的

製品のライフサイクルがRailsとあわない

Railsのスピードは速すぎる

(6)

Railsでなければ何?

開発当初

Ruby 1.8.x

CGI (Apache + mod_ruby)

生JavaScript

(7)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

ちなみに現在は…

Ruby 2.1

Apache

Passenger

Rack

Padrino(一部)

jQuery(一部)

Sequel

(8)
(9)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

「MySQLだけでなく

(10)

Symfoware

富士通 RDBMS製品

2013年 PostgreSQL互換エディション追加

Ruby や Postfix 等、多くの OSS からも使える

MySQLに特化した独自O/R Mapper では厳し

(11)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

Sequel

(12)

Sequel

MySQL/PostgreSQL/その他RDBMSに対応した

O/R Mapper

SQLをRubyスクリプトで記述

conn

=

Sequel

.

connect

(

'

mysql://user:pass@host/db

'

)

conn

[

:users

].

insert

(

name

:

'

abc

'

,

age

:

32)

conn

[

:users

].

where

(

name

:

'

abc

'

).

select

(

:age

).

first

# => { age: 32 }

Hash で条件の指定、値の設定、値の取得

複雑なクエリも記述可能

(13)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

Sequel

Active Record パターンにも対応

class

User

<

Sequel

::

Model

# usersテーブルの構造を動的に取得

end

user

=

User

.

new

user

.

name

=

'

abc

'

user

.

age

=

32

(14)

Sequel

マイグレーション機能

コネクションプール

トランザクション/SAVEPONIT

サブクエリ

Join

(15)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

Sequel対応

API, 構文の違いは吸収してくれる

API 以外は地道にコツコツと…

MySQLはゆるいがPostgreSQLは厳しい

数値カラムと文字列との比較

カラムサイズ以上に文字列格納

DATEカラムに不正な日付を登録 等々

その他: 大文字小文字を区別するかどうか / カラ

ム型の違い / AUTOINCREMENT

(16)

性能測定

Jenkins

サービス停止

sar開始

サービス起動

sar停止

測定

SMTP

IMAP

POP

gnuplot

・・・

(17)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

結果

遅い

0 5 10 15 20 25 30 多重度 スループット OLD NEW

(18)

原因

Sequel層が増えたためCPU使用率増

Active Record でDB接続時にテーブル構造を

取得

(19)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

デーモンプロセス

古き良きUNIXデーモンモデル

クライアントからの接続を受けると子プロセスをfork

クライアントから切断されると子プロセスが終了

Parent

Client

RDBMS

Client

Child

Child

(20)

改善案

マルチスレッド化

プロセス生成コスト減

コネクションプールを使用

Process

Client

RDBMS

Client

Thead

Thread

(21)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

スレッドセーフ化

既存コードをマルチスレッド対応

地道にコツコツと…

クラスメソッド

クラス変数

グローバル変数

シングルトンクラス

プロセスIDを一意性のために使用していないか

(22)

結果

遅い

0 5 10 15 20 25 30 多重度 スループット OLD NEW

(23)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

原因

Rubyは1プロセスが同時に1CPUしか使えない

複数スレッドを作成しても同時に動けるのは1個

だけ

クライアントから大量の接続があると、サーバー

のすべての CPU を使いきってないのに頭打ち

マルチプロセス&マルチスレッドにしたい

(24)

ParallelServer

マルチプロセス&マルチスレッドサーバーライブラリ

Child Parent Client RDBMS Thread Thread Client Child Thread Thread

(25)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

ParallelServer

最小/最大プロセス数、プロセスあたりのスレッド

数を指定して、プロセスが増減して動く

# TCP/IP 12345 ポートで待ち受ける

ParallelServer

::

Prefork

.

new

(

12345

,

max_threads

:

5

,

max_processes

:

10

)

.

start

do

|

sock

,

addr

|

# ここは子プロセス

sock

.

puts 'Who are you?'

name

=

sock

.

gets

sock

.

puts "Hello, #{name}"

(26)

結果

0 10 20 30 40 50 60 70 80 90 100 多重度 スループット OLD NEW

(27)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

GC

メモリ使用量を抑えるためGC.startしてた

マルチスレッドプロセスだと全スレッドが停止して

しまう

GC.start 廃止

(28)

結果

0 10 20 30 40 50 60 70 80 90 100 多重度 スループット OLD NEW

(29)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

メモリ使用量

(30)

GC.startあり

0 10 20 30 40 50 60 70 80 90 100 多重度 メモリ使用量 OLD NEW

(31)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

GC.startなし

0 10 20 30 40 50 60 70 80 90 100 多重度 メモリ使用量 OLD NEW

(32)

メモリ使用量削減

Sequel のスキーマキャッシュを使用

できるだけオブジェクトを作らない

無駄な処理を見直し

Timeout 削減

jemalloc

(33)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

Timeout削減

データを1行出力する毎にタイムアウト処理

大量にスレッド生成&破棄

msgs

.

each

do

|

msg

|

〜処理〜

Timeout

.

timeout

(

999

)

do

socket

.

write data

end

end

(34)

jemalloc

逆効果

Rubyで1000スレッド作成したときのメモリ使用量の増分(MB)

標準 jemalloc 0 200 400 600 800 1000 1200 1400 1600 41 1451 MB

(35)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

最新状況(スループット)

0 5 10 15 20 25 30 多重度 スループット OLD NEW

(36)

最新状況(メモリ)

0 10 20 30 40 50 60 70 80 90 100 多重度 メモリ使用量 OLD NEW

(37)

非Railsアプリのマルチデータベース対応と高速化の取り組み Powered by Rabbit 2.1.9

まとめ

Sequel

Rubyの構文でSQLクエリを組み立てるのがかなり読

みやすい

マルチデータベース対応でなくてもおすすめ

マルチプロセス&マルチスレッド

「推測するな、計測せよ」

計測〜グラフ生成まで自動しておくと捗る

(38)

参照

関連したドキュメント

主人が部曲を殴打して死亡させた場合には徒一年に処する。故意に殺害した 場合 (1) には一等を加重する。(部曲に)落ち度 (2)

工学部80周年記念式典で,畑朋延工学部長が,大正9年の

HORS

(4) 現地参加者からの質問は、従来通り講演会場内設置のマイクを使用した音声による質問となり ます。WEB 参加者からの質問は、Zoom

年度まで,第 2 期は, 「日本語教育の振興」の枠組みから外れ, 「相互理解を進 める国際交流」に位置付けられた 2001 年度から 2003

ㅡ故障の内容によりまして、弊社の都合により「一部代替部品を使わ

今後の取り組みは、計画期間(2021~2040 年度)の 20 年間のうち、前半(2021~2029

部長 笹本弘美 2016