プロセスの並列とCPUの効率性

Goでプログラムを書くと処理が早い。

ファイル処理のプログラムを書いていたのだけど
1ファイルの変換プログラムを書いたら、そのまま並列処理をさせようと設計検討をしていた。

そしたら上司から「順番は意識しなくていいのだから、1CPUで1ファイル処理させるようにしてから並列させてスループットを上げてね」と言われた。

何を言ってるのだろうと思ったけど、新しい知見が理解できたのでメモしておく。

普通のプログラムはCPUを全部使う

プログラムを実行させるとそのプログラムを終わらせるために全CPUを使って処理を行う。

ターミナルでtopコマンドを実行してみよう。

top

このとき

top -d1

とかしてやれば、1秒ごとに更新してくれる。

そんで「1」を押してみるとCPUごとの使用率が表示される。

f:id:suganoo:20180222190857p:plain

この状態のままなんかプログラムを実行すると
うわーっと全コアの使用率が上がってきて、全CPUが使われるのがわかると思う。

f:id:suganoo:20180222190847p:plain

並列化してみる

でこのファイル変換処理プログラムを並列実行させてみた。

自分がやったのは goroutine でスレッド作って
それぞれの中で exec.Command(ファイル変換処理).Run() を実行して、変換処理を並列化させてみた。

もちろん1プロセスで全CPUコア使ってるのだから
並列化するとさらにもっと全CPUを使う。

CPU使用数を固定する

goにはCPU使用数を決めてくれる便利な関数がある。

import "runtime"

func main() {
        runtime.GOMAXPROCS(1)  // <---- CPU数を指定できる
.....
}

runtime の runtime.GOMAXPROCS(1) を使うとCPU使用数を固定してくれるそうだ。

CPU使用数を固定して並列化

この設定をファイル変換処理プログラムに入れて並列処理させた。

するとCPUはちゃんと1コアごとに処理して並列処理してた。
f:id:suganoo:20180222190839p:plain

処理性能はどうなった

こんな設定を入れたんだからスループットはどうなったの?が大事なところ。

f:id:suganoo:20180222170609p:plain

こんな風になって割り込みが減るから効率化すると思ってたんだけど

結論として、あんまり変わらなかった。
でもCPU使用率は10%近く下がった。

条件を述べてなかったので書いておく
※ごめんなさい。あまり詳しく書けないです。

CPUコア数 32 (論理CPU:32, 物理CPU:16)
全ファイル処理行数 数億行
ファイル数 んーごめんわすれた。。。1000~2000ファイル?数十万行/ファイルだった気がする

もともと1ファイルの処理性能として

全コア使用 1コア固定
処理時間 22秒 80秒
CPU使用率 13% 3%

だった

並列化して全データを処理した結果が下記
(いくつかのケースで検証したけど抜粋)

並列数 CPU使用率 処理時間
全コアで処理 6パラ 70% 130分
1コア/1プロセスで処理 20パラ 62% 133分

↑CPU使用率を同じくらいにしようとした。

結局のところスループットはちょっと落ちたのだけど
CPU使用率が10%近く下がっていた。

個人的には「おおーめっちゃスループット出てる!」とか言いたかったけど、そうでもなかったのが残念。

# そもそもなんだけど、両ケースではファイル変換ライブラリに与えるパラメータ値も違うので正しく比較できないが、あんまり変わらなかったってことが言えればいいと思ってます。。。

並列数は物理CPU数以下がいい

この本を読み返してみるとこんなことが書いてあった。並列数を変えてやってみました。
suganoo.hatenablog.com

P246
Go 1.5からは、デフォルトでruntime.GOMAXPROCS()が設定されるようになったので、特別な場合を除いてわざわざ設定する必要はありません。しかし、最速を狙おうとすると、このデフォルト値の半分に設定するほうがスループットが上がる場合があります。現代のCPUのいくつかは、余剰のCPUリソースを使って1コアで2余剰のCPUリソースを使って1コアで2つ以上のスレッドを同時に実行する機構(ハイパースレッディングやSMT(Simultaneous Multi-Threding))を備えています。そのような機構を利用している場合、1コアで2つのヘビーな計算を同時に実行すると、CPUコアのリソースを食い合ってパフォーマンスが上がらないことがあります。

へーへーへー!!


こんなところをたまたま見つけたので並列数をいくつか変えてやってみました。

ここで書いてないんだけど1コア/1プロセスの条件下で並列数を変えて実施したところ、確かに16パラ数で実施した場合の1プロセスあたりの処理性能がが一番よかった。

物理コア数以上の並列数を実行すると1プロセスあたりの処理行数が下がっていることがわかりました。

反省点とかまとめとか

  • コア数固定で並列数をあげるとスループットはどうなるかわからないけど、CPU効率は良くなりそう。
  • そもそもサーバーのスペックが良すぎるから、あまり差が出なかったのではと思ってる。
  • 1コア/1プロセスで並列化させるとCPU使用率が比例するから推測しやすく、かけ算するだけで良い。
  • なんかもうちょっと使い方をよくすればもっとスループットが出そうな気がする。

ひとまずここまで。

Goでロガーを作ってみた

Goでロガーを使おうとするとなかなかいいのがない。

logパッケージのやつをそのまま使おうとするとなんか物足りなく使いにくい。
誰かが作ったやつも使いにくい。

blog.hde.co.jp

こういうのあるみたいだけどなんかしっくりこない。。。

なのでlogパッケージをもとにしてラップして作ってみた。
もともとpythonやっててloggingをよく使ってたので
それに近いものを想定してみた。

github.com


いろいろログに出てくるんだけど
どの行どの関数で呼び出されたかも出力されるようにしてみた。


ちょっとまだQiitaとかは怖いので、こっそりここで告知。

もうちょっと修正したらQiitaにも書いてみようかな。

参考ページ
stackoverflow.com
sgykfjsm.github.io
qiita.com


P.S
Qiitaに投稿してみた。
内容はおんなじなんだけど。

qiita.com

while で sshコマンドを実行すると1回しか実行されない

タイトルどおりなのですがすごく悩んだあげく
ググってみたらすぐ解決策が見つかったのでメモしておく。

chat-rate.com

www.m-bsys.com
2番目のブログから引用しますが

原因はsshコマンド実行に伴う標準入力の切替です。sshコマンドを実行すると、ローカルホストからの標準入力を停止し、sshで指定したリモートホストからの標準入力の受付を開始します。

つまり、上記のコードの例では、ローカルホストのファイルの読込みを終了させた上でsshコマンドを実行し、再びreadコマンドを実行しようとしているわけです。この時、既にファイルが閉じている為にwhileが終了してしまうわけです。

なるほど!

Go言語でプロキシ経由でs3からダウンロードする

go言語でs3からダウンロードする方法は探せばなんとか見つかりました。
でもプロキシを使うケースがよくわからず、なんとかコーディングしてみたので備忘として載せておく。


Go言語でs3からファイルダウンロード+プロキシ使う版

幻冬社セールやってる!「お金2.0」が半額だって

amzn.to


ちょっとびっくりしました。
amazonで本をあさってたら、「お金2.0」がkindleで半額ですよ!

即ポチってしまいました。

仮想通貨持ってますか?

私もミーハー心から持ってます。
これからのトークン経済など世の中どうなるのか?気になりますね。
この本で勉強してみます。


あと他にもお得なセールがあってびっくり!

これも買っちゃいました!

世の中の変化はとても早い。
読書は生き残るための戦いだ。

「みんなのGo言語【現場で使えるテクニック】」を読んでみた

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

実践的な技術書

go言語の本ってあんまり多くないんですよね。
翻訳本か、初心者向けが多い感じに見えます。

そんな中この本はすごく実戦向きで、だんだんとGoを使ってコーディングしていったときに
あーこれこれ、そーなんだ!と言える本でした。

reflect の解説はちょうど今の業務で性能が出なくなったところだったので参考になりました。

コマンドラインの作り方、goroutine、reflect、タイマー、テスト、などと
おそらくGoを使ってれば一度は悩むところが書かれています。

ページ数も140ページ程度と薄い本なのに、内容はかなり濃いです。
でもやっぱり薄いので、深堀してQiitaとかにあげてみるのもいいですね。


これはかなりおすすめ!

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

「Linux超入門」を読んでみた

動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)

動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)

こんな本を読んでみました。これも会社購入です。
Linux超入門」
suganoo.hatenablog.com

前回この記事でGo言語の本を読んでましたが、その後半の索引で著者がおすすめしていたので読みたくなったのです。
やっぱりGo言語はレイヤーの低いところから操作できるので、Linuxがもっと理解できるといいなと思ったのです。

けっこう難しかった

いきおいでお願いしてしまったのですが、よく見たらこれCQ出版
組み込み系の分野で定評のある出版社ですね。

なので中身は組み込みエンジニア向けに書かれています。

デバイスドライバ、メモリ管理、スケジューリング.....などなどと図を交えてカーネル内部の内容を説明しててわかりやすかったです。

まあ、でもね、大半は難しかった。。。。

なかでも理解できたところとしては、メモリ管理の部分くらい。
free コマンドの解説や、ページ・キャッシュ、バッファ・キャッシュのところがあいまいに理解してたところがよくわかって、よい収穫でした。

動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)

動くメカニズムを図解&実験! Linux超入門 (My Linuxシリーズ)

ネットワークの勉強で役立つ本

昔読んでよかったネットワーク関係の本を備忘として載せておきます。

インターネットがどうやって通信してるのかな、TCP/IPってどうやって振り分けてんだろと思ってました。

そんな時に読んだ本がこれ。
パケットのルーティングプロトコルがわかってめちゃくちゃ面白くなったのがよく覚えてます。

まあでももう10年以上前のことなのかー
下の3冊でかなり力がついた気がします。

基礎からわかるTCP/IP ネットワーク実験プログラミング―Linux/FreeBSD対応

基礎からわかるTCP/IP ネットワーク実験プログラミング―Linux/FreeBSD対応

基礎からわかるTCP/IP ネットワークツール活用

基礎からわかるTCP/IP ネットワークツール活用

TCP/IPソケットプログラミング C言語編

TCP/IPソケットプログラミング C言語編

でマスタリングシリーズ
正直に言って読んだことないのですが、勧める友人が多いので勧めておきます。

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

あとすごくおすすめの雑誌で「日経ネットワーク」
amazonで探してみても見つからない。。。どこだ???
itpro.nikkeibp.co.jp

昨今出版不況で廃刊になる雑誌が多い中「日経ネットワーク」は残ってました。トレンドの内容を初心者から上級者まで網羅した内容ですごく力がつきます。

その部分特集の本もおすすめ

「パケットキャプチャの教科書」を読んでみた

パケットキャプチャの教科書 (Informatics&IDEA)

パケットキャプチャの教科書 (Informatics&IDEA)

ネットワークが得意な人

なんとはなくネットワーク技術に得意な人っていますよね。
この本はそういう人にとって、ふさわしい本です。

ネットワークの勉強を始めたのはいつだったかな。
たしか高度情報処理試験のネットワーク試験の対策で始めたのが最初だったと思います。
なんかのネットワークのテキストを買ってきて読んだのですが、パケットが振り分けられて相手のところに通信できることがすごーく面白かった覚えがあります。

これも若手向けで、自分も若い時に読んでおきたかったなと思いました。
高度情報処理のネットワーク試験対策にもうってつけです。

プロトコルは変わりにくい

ネットワーク技術の知識って変わりにくいんですよ。
なので一度理解してしまえば、ながーく使えます。

本の内容

この本のいいところとして、Wiresharkの使い方から乗ってんですよ。
アプリケーションの使い方から載ってるのは、初学者にとってはすごくありがたい。

そしてEthernetの低レイヤーのパケットの中身から、だんだんとレイヤー2、レイヤー3とあがって行って説明してくれてるもんだから、パケットの内容がとてもよく理解できます。

うん Itエンジニアの教養として読んでおくのもいいですね。


パケットキャプチャの教科書 (Informatics&IDEA)

パケットキャプチャの教科書 (Informatics&IDEA)


suganoo.hatenablog.com

Alibaba ジャック・マーの話が深い

www.buzzfeed.com

失敗から学ぶ

ダボス会議でジャック・マーが登壇したそうです。

下記はBuzzFeedNewsからの引用です。

覚えておいてください。成功したいなら、他人のミスから学びなさい。他人の成功話は、聞かなくてもいいです。

どんなに賢くても、いつかは間違えるのです。他人のミスを学ぶのは、間違いを避けるためではなく、どう対処すればいいのかわかるようになるからです。

もし本を出すとしたら「アリババの1001個のミス」を書きたい。人生で最も重宝しているのが、失敗だから。

何をどれだけ成し遂げたのではなく、どれだけ苦労してミスと向き合ってきたのか——それが私の人生だから。

私がとても感銘を受けたのはこの部分です。

成功した話はその人そのタイミングでうまくいったのでは?と考えてしまい、あまり得るものが多くありません。
それよりもやってはいけないことを避ける方が良い方向に向かいやすいのです。
継続する観点からもその方がいいですね。

野村監督も

勝ちに不思議の価値あり、負けに不思議の負けなし。

と言ってます。

うまくいかない時って適切な方法を取ってないことが多いんですよね。
自分も戒めようと思いました。

これぞジャック・マーだ

これぞジャック・マーだ

  • 作者: 陳偉,光吉さくら,ワンチャイ
  • 出版社/メーカー: 大樟樹出版社
  • 発売日: 2017/11/23
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る