SlideShare une entreprise Scribd logo
1  sur  8
USP 友の会・シェル芸勉強会 LT - 2014/02/15

Shell で制限付き並列処理をしよう
日本 GNU AWK ユーザー会
斉藤 博文
hi_saito@yk.rim.or.jp
@hi_saito
Page 1

http://gauc.no-ip.org/awk-users-jp/
USP 友の会・シェル芸勉強会 LT - 2014/02/15

なぜ制限を付けるのか?
 ImageMagick で 1,000 枚の PNG 画像から
アニメーション GIF を並列処理で作成。
 メモリを消費してしまい、スワップで操作
不能に陥る。orz
 何でこんなことをしていたかは秘密で
す。w

何らかの制限を付けないと同じミスが出る
Page 2

http://gauc.no-ip.org/awk-users-jp/
USP 友の会・シェル芸勉強会 LT - 2014/02/15

Shell で並列処理
 bash 前提なので、数値演算は (( と )) で C
言語っぽく。
for (( i = 1; i <= 1000; i++ )); do
sleep 2 &
done

処理内容によっては大いに不安が残る
Page 3

http://gauc.no-ip.org/awk-users-jp/
USP 友の会・シェル芸勉強会 LT - 2014/02/15

ここで問題!
 メモリを無視して指定ジョブ数だけジョブを
投入する?
 コア数を無視してメモリを消費しきれるだけ
ジョブを投入する?

どちらがいいのだろうか?
Page 4

http://gauc.no-ip.org/awk-users-jp/
USP 友の会・シェル芸勉強会 LT - 2014/02/15

ジョブ数に制限をかける
MAX_JOBS=10

for (( i = 1; i <= 1000; i++ )); do
sleep 2 &
CJOB_NUM=$(( $(ps --ppid $$ | wc -l) - 1 ))
while :; do
CJOB_NUM=$(( $(ps --ppid $$ | wc -l) - 1 ))
if (( ${CJOB_NUM} < ${MAX_JOBS} )); then
break
fi
done
done

本当に CPU 律速しているのだろうか?
Page 5

http://gauc.no-ip.org/awk-users-jp/
USP 友の会・シェル芸勉強会 LT - 2014/02/15

メモリに制限をかける
MEM=$(free -b | awk '/Mem:/ {print $2}')
MAX_MEM=$(awk '{print int($0 * 0.3)}' <<<${MEM})
for (( i = 1; i <= 1000; i++ )); do
sleep 2 &
CJOB_MEM=$(ps -o rss --ppid $$ | awk 'NR>1 {s+=$0} END{print s}')
while :; do
CJOB_MEM=$(ps -o rss --ppid $$ | awk 'NR>1 {s+=$0} END{print s}')
if (( ${CJOB_MEM} < ${MAX_MEM} )); then
break
fi
done
done

いわゆる CPU バウンドな処理
Page 6

http://gauc.no-ip.org/awk-users-jp/
USP 友の会・シェル芸勉強会 LT - 2014/02/15

良く使う並列処理
 xargs
 ジョブ数のみの指定
 make
 ジョブ数と Load Average の指定が可能

メモリに制限をかけるようなものってないもの
か?
Page 7

http://gauc.no-ip.org/awk-users-jp/
USP 友の会・シェル芸勉強会 LT - 2014/02/15

まとめ
 ジョブ数やメモリに制限をかけるような Shell
スクリプトがあまりなかったので作ってみた
よ。
 もちろん、両方の制限をかけても良いよね。
 I/O に制限をかけても面白いけど、良い方法
が見当たらなかった。

どちらが良いかは要件次第
Page 8

http://gauc.no-ip.org/awk-users-jp/

Contenu connexe

Tendances

Perlと本気で向き合いたくない人と向き合う僕ら
Perlと本気で向き合いたくない人と向き合う僕らPerlと本気で向き合いたくない人と向き合う僕ら
Perlと本気で向き合いたくない人と向き合う僕らdebug-ito
 
かんたんCMS Picoについて
かんたんCMS PicoについてかんたんCMS Picoについて
かんたんCMS Picoについて高見 知英
 
関係者も納得する既存サイトをクラウド化する方法 JAWS-UGクラウド女子会一回目2011/01
関係者も納得する既存サイトをクラウド化する方法 JAWS-UGクラウド女子会一回目2011/01 関係者も納得する既存サイトをクラウド化する方法 JAWS-UGクラウド女子会一回目2011/01
関係者も納得する既存サイトをクラウド化する方法 JAWS-UGクラウド女子会一回目2011/01 Aya Komuro
 
オレオレPHPのつくり方
オレオレPHPのつくり方オレオレPHPのつくり方
オレオレPHPのつくり方Ryusuke Sekiyama
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』H2O Space. Co., Ltd.
 
Hashicorpツールズ
HashicorpツールズHashicorpツールズ
HashicorpツールズUchio Kondo
 
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprintやすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprinttaiju higashi
 
8F Emacs seminar 1st
8F Emacs seminar 1st8F Emacs seminar 1st
8F Emacs seminar 1sttoshi_pp
 
Cargo makeを使ってみた話
Cargo makeを使ってみた話Cargo makeを使ってみた話
Cargo makeを使ってみた話emakryo
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeKiwamu Okabe
 
Polyphony 新機能ツアー
Polyphony 新機能ツアーPolyphony 新機能ツアー
Polyphony 新機能ツアーryos36
 
Async Programming on Ruby
Async Programming on RubyAsync Programming on Ruby
Async Programming on RubyKazki Matsumoto
 
Power Assert and perl.js
Power Assert and perl.jsPower Assert and perl.js
Power Assert and perl.jsGoro Fuji
 
VimとRubyのアツい関係
VimとRubyのアツい関係VimとRubyのアツい関係
VimとRubyのアツい関係Misao X
 

Tendances (19)

Perlと本気で向き合いたくない人と向き合う僕ら
Perlと本気で向き合いたくない人と向き合う僕らPerlと本気で向き合いたくない人と向き合う僕ら
Perlと本気で向き合いたくない人と向き合う僕ら
 
かんたんCMS Picoについて
かんたんCMS PicoについてかんたんCMS Picoについて
かんたんCMS Picoについて
 
関係者も納得する既存サイトをクラウド化する方法 JAWS-UGクラウド女子会一回目2011/01
関係者も納得する既存サイトをクラウド化する方法 JAWS-UGクラウド女子会一回目2011/01 関係者も納得する既存サイトをクラウド化する方法 JAWS-UGクラウド女子会一回目2011/01
関係者も納得する既存サイトをクラウド化する方法 JAWS-UGクラウド女子会一回目2011/01
 
オレオレPHPのつくり方
オレオレPHPのつくり方オレオレPHPのつくり方
オレオレPHPのつくり方
 
ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』ちゃんとWeb会議スライド『Coffee script』
ちゃんとWeb会議スライド『Coffee script』
 
Tfug kansai vol3
Tfug kansai vol3Tfug kansai vol3
Tfug kansai vol3
 
Hashicorpツールズ
HashicorpツールズHashicorpツールズ
Hashicorpツールズ
 
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprintやすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
 
8F Emacs seminar 1st
8F Emacs seminar 1st8F Emacs seminar 1st
8F Emacs seminar 1st
 
SVG、あきた
SVG、あきたSVG、あきた
SVG、あきた
 
Cargo makeを使ってみた話
Cargo makeを使ってみた話Cargo makeを使ってみた話
Cargo makeを使ってみた話
 
Libjpeg turboの使い方
Libjpeg turboの使い方Libjpeg turboの使い方
Libjpeg turboの使い方
 
TextMate
TextMateTextMate
TextMate
 
コマンドライン使いもLibreOffice
コマンドライン使いもLibreOfficeコマンドライン使いもLibreOffice
コマンドライン使いもLibreOffice
 
This is Tsuru.
This is Tsuru.This is Tsuru.
This is Tsuru.
 
Polyphony 新機能ツアー
Polyphony 新機能ツアーPolyphony 新機能ツアー
Polyphony 新機能ツアー
 
Async Programming on Ruby
Async Programming on RubyAsync Programming on Ruby
Async Programming on Ruby
 
Power Assert and perl.js
Power Assert and perl.jsPower Assert and perl.js
Power Assert and perl.js
 
VimとRubyのアツい関係
VimとRubyのアツい関係VimとRubyのアツい関係
VimとRubyのアツい関係
 

Plus de 博文 斉藤

Obsidian Talk JP 資料 - 2021-10-15
Obsidian Talk JP 資料 - 2021-10-15Obsidian Talk JP 資料 - 2021-10-15
Obsidian Talk JP 資料 - 2021-10-15博文 斉藤
 
 Obsidian Talk JP - Template & Daily notes - 2021-09-04
 Obsidian Talk JP - Template & Daily notes - 2021-09-04 Obsidian Talk JP - Template & Daily notes - 2021-09-04
 Obsidian Talk JP - Template & Daily notes - 2021-09-04博文 斉藤
 
Markdown で行こう!
Markdown で行こう!Markdown で行こう!
Markdown で行こう!博文 斉藤
 
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料博文 斉藤
 
シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」
シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」
シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」博文 斉藤
 
シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」
シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」
シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」博文 斉藤
 
「やっちまったぁ!」を防ごう!
「やっちまったぁ!」を防ごう!「やっちまったぁ!」を防ごう!
「やっちまったぁ!」を防ごう!博文 斉藤
 
curl で iPhone にプッシュ通知しよう
curl で iPhone にプッシュ通知しようcurl で iPhone にプッシュ通知しよう
curl で iPhone にプッシュ通知しよう博文 斉藤
 
Usptomonokai 20111028
Usptomonokai 20111028Usptomonokai 20111028
Usptomonokai 20111028博文 斉藤
 
USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413博文 斉藤
 
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall博文 斉藤
 
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall博文 斉藤
 
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall博文 斉藤
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
お手軽並列処理
お手軽並列処理お手軽並列処理
お手軽並列処理博文 斉藤
 

Plus de 博文 斉藤 (15)

Obsidian Talk JP 資料 - 2021-10-15
Obsidian Talk JP 資料 - 2021-10-15Obsidian Talk JP 資料 - 2021-10-15
Obsidian Talk JP 資料 - 2021-10-15
 
 Obsidian Talk JP - Template & Daily notes - 2021-09-04
 Obsidian Talk JP - Template & Daily notes - 2021-09-04 Obsidian Talk JP - Template & Daily notes - 2021-09-04
 Obsidian Talk JP - Template & Daily notes - 2021-09-04
 
Markdown で行こう!
Markdown で行こう!Markdown で行こう!
Markdown で行こう!
 
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
OSC・シェルのプロが語る『make を使ったデータ処理。』 【make 教】 - OSC2015 Tokyo/Spring 発表資料
 
シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」
シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」
シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」
 
シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」
シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」
シェルスクリプトワークショップ資料 - 初心者向け「シェル芸」
 
「やっちまったぁ!」を防ごう!
「やっちまったぁ!」を防ごう!「やっちまったぁ!」を防ごう!
「やっちまったぁ!」を防ごう!
 
curl で iPhone にプッシュ通知しよう
curl で iPhone にプッシュ通知しようcurl で iPhone にプッシュ通知しよう
curl で iPhone にプッシュ通知しよう
 
Usptomonokai 20111028
Usptomonokai 20111028Usptomonokai 20111028
Usptomonokai 20111028
 
USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413
 
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
 
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 2 - OSC2012 Tokyo/Fall
 
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会スライド 1 - OSC2012 Tokyo/Fall
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
お手軽並列処理
お手軽並列処理お手軽並列処理
お手軽並列処理
 

Shell で制限付き並列処理をしよう

  • 1. USP 友の会・シェル芸勉強会 LT - 2014/02/15 Shell で制限付き並列処理をしよう 日本 GNU AWK ユーザー会 斉藤 博文 hi_saito@yk.rim.or.jp @hi_saito Page 1 http://gauc.no-ip.org/awk-users-jp/
  • 2. USP 友の会・シェル芸勉強会 LT - 2014/02/15 なぜ制限を付けるのか?  ImageMagick で 1,000 枚の PNG 画像から アニメーション GIF を並列処理で作成。  メモリを消費してしまい、スワップで操作 不能に陥る。orz  何でこんなことをしていたかは秘密で す。w 何らかの制限を付けないと同じミスが出る Page 2 http://gauc.no-ip.org/awk-users-jp/
  • 3. USP 友の会・シェル芸勉強会 LT - 2014/02/15 Shell で並列処理  bash 前提なので、数値演算は (( と )) で C 言語っぽく。 for (( i = 1; i <= 1000; i++ )); do sleep 2 & done 処理内容によっては大いに不安が残る Page 3 http://gauc.no-ip.org/awk-users-jp/
  • 4. USP 友の会・シェル芸勉強会 LT - 2014/02/15 ここで問題!  メモリを無視して指定ジョブ数だけジョブを 投入する?  コア数を無視してメモリを消費しきれるだけ ジョブを投入する? どちらがいいのだろうか? Page 4 http://gauc.no-ip.org/awk-users-jp/
  • 5. USP 友の会・シェル芸勉強会 LT - 2014/02/15 ジョブ数に制限をかける MAX_JOBS=10 for (( i = 1; i <= 1000; i++ )); do sleep 2 & CJOB_NUM=$(( $(ps --ppid $$ | wc -l) - 1 )) while :; do CJOB_NUM=$(( $(ps --ppid $$ | wc -l) - 1 )) if (( ${CJOB_NUM} < ${MAX_JOBS} )); then break fi done done 本当に CPU 律速しているのだろうか? Page 5 http://gauc.no-ip.org/awk-users-jp/
  • 6. USP 友の会・シェル芸勉強会 LT - 2014/02/15 メモリに制限をかける MEM=$(free -b | awk '/Mem:/ {print $2}') MAX_MEM=$(awk '{print int($0 * 0.3)}' <<<${MEM}) for (( i = 1; i <= 1000; i++ )); do sleep 2 & CJOB_MEM=$(ps -o rss --ppid $$ | awk 'NR>1 {s+=$0} END{print s}') while :; do CJOB_MEM=$(ps -o rss --ppid $$ | awk 'NR>1 {s+=$0} END{print s}') if (( ${CJOB_MEM} < ${MAX_MEM} )); then break fi done done いわゆる CPU バウンドな処理 Page 6 http://gauc.no-ip.org/awk-users-jp/
  • 7. USP 友の会・シェル芸勉強会 LT - 2014/02/15 良く使う並列処理  xargs  ジョブ数のみの指定  make  ジョブ数と Load Average の指定が可能 メモリに制限をかけるようなものってないもの か? Page 7 http://gauc.no-ip.org/awk-users-jp/
  • 8. USP 友の会・シェル芸勉強会 LT - 2014/02/15 まとめ  ジョブ数やメモリに制限をかけるような Shell スクリプトがあまりなかったので作ってみた よ。  もちろん、両方の制限をかけても良いよね。  I/O に制限をかけても面白いけど、良い方法 が見当たらなかった。 どちらが良いかは要件次第 Page 8 http://gauc.no-ip.org/awk-users-jp/