マンガでよめる痔のこと・薬のこと

linuxマルチコアCPU環境においてコアの使われ方について


マルチコアCPUがLinxu環境において(その他Linuxでないプラットフォームにおいても)、
実際に搭載されているCPUのコア数が正常にOSに認識されているというだけではなく、
各プロセスの処理に対して複数のコアが適宜効果的に利用されているのかどうか??
ということが知りたく、添付画像に私の疑問点をまとめてみました。

■ポイント
++++++++++++++++++++++++++++++++++++++++++++++++
投稿した画像の色がついている4つの矢印は1つ1つそれぞれがDB接続クライアントがmysqlに投げているSQL文(クエリ)をイメージしています。
Mysqlを起動させているlinux kernelは、このクエリを受け取り自身が管理しているCPUがマルチコアであった場合、どのようなロジックで複数のコアの中から4つのクエリを処理させるCPUコアを選択しているのでしょうか?

例)kernelが未使用のCPUコアを都度選んで1クエリの処理を担当するよう制御している
⇒コアによって処理する数は異なる

例)kernelが4つのクエリに対して4つのCPUコアをラウンドロビン分散させて処理させている。
⇒コアが処理する数は均等になる
++++++++++++++++++++++++++++++++++++++++++++++++

どなたか、私の疑問についてご存知でしたらご教授いただけますでしょうか。

よろしくお願します。

「linuxマルチコアCPU環境においてコ」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (1件)

カーネルバージョンによってスケジューリングが異なりますが、どのバージョンでも、無用なオーバーヘッド低減のために、プロセス単位でCPU時間を割り当てていたと思います。

    • good
    • 0
この回答へのお礼

Murasan759 さん
ご回答ありがとうございます。

回答いただいた内容をもとに、
「kernel2.6 スケジューラ」というkeywordでgoogle検索したところ、

このページに行き着き、
http://d.hatena.ne.jp/takaochan/20071206/1196951 …

さらに、「O(1)スケジューラ」という
keywordでgoogle検索したところ、


このページにたどり着きました。
http://www.itmedia.co.jp/enterprise/articles/040 …

さらに、さらに、itmediaの記事の中で「CPUごとのRUNキュー」
というセクションがありましたので、
「RUNキュー」でgoogle検索したところ、

以下のページにたどりつきました。
http://www.nces.is.nagoya-u.ac.jp/NEXCESS/blog/i …


これで知りたいことの大体は理解できました。

ただ、実際のところ、このロジック通りに、
たとえば4コアある環境で、

「マルチプロセッサシステムに対応したLinuxでは,CPUごとにこのRUNキューを持ちます.そして, RUNキュー間で負荷状態に偏りが出たときは、RUNキュー間で実行待ちプロセスのマイグレートを行い,バランスを取ります.→ロードバランス」

このようにコアのロードバランスがうまくされているのか?
について深追いしたいとなった場合、やはり、実環境で調べてみるしかないのでしょうか??

お礼日時:2010/03/10 13:40

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCPUコアの使われ方についてご教授ください

はじめまして。CPUのコア数に関する質問です。
例えば、ある一つのサーバにCPUが2個、1CPUあたり6コアのスペックとします。
毎時定刻に、一つのバッチ処理が起動します。
そのバッチ処理は、多数のCSVファイルを入力として、チェック後、DBへ必要情報を更新します。
CSVファイルがめちゃめちゃ多い(数万件)ため、できる限り早く処理を実行したいと考えてます。
バッチ処理のアプリケーションは、シングルタスクです。
こうした条件のもと、OSは自動的に12コアのメリットを生かすようにジョブをコアに割り当てて
くれるものでしょうか?
私の周りには、技術者もどきが多く、いろんな意見があります。
ある人は、アプリを多重化したつくりにしないと、いくらコアがあっても一つの処理に使われるコアは一つだけという人と、アプリは意識しなくともOSが自動的にコアに割り当ててくれるという意見の人もいます。
本当のところどうなんでしょうか?
専門家のご意見をいただきたくお願いします。

Aベストアンサー

バッチ処理は、「シングルタスク」で「シングルスレッド」です。
なので、結論から言えばコア1つの処理になります。

【マルチタスクとは】
複数のアプリケーションを同時に実行する処理の事です。
その際、シングルコアだと並列して処理するアプリケーションが順にスケジューリングされ、順番に処理されていきます。
なので、複数のアプリケーションが同時に実行出来ます。
※シングルタスクでは他のアプリが終了するまで、次のアプリは処理待ちになる。
また、マルチコアの場合はそれぞれのスケジューリングが複数のコアにスケジューリングされるので、コア数が増えれば処理速度が早くなる。
コア数が増えた場合、個々のアプリの速度は変わらないが複数のアプリを同時に実行した場合に早くなる。
例えば、シングルコアで4つのアプリを起動した場合に、シングルスレッドではそのアプリが終了するまで他のアプリは待ち状態となり、終わったら次へと処理されて行く。
マルチスレッドでは、4つのアプリがそれぞれプロセス単位でスケジューリングされ少しずつ順番にプロセスが処理されていきあたかも同時に実行しているかのように処理されて行く。
また、2コアだったとすると、4つのアプリのプロセスが2つのコアに分散されてスケジューリングされるので、1コアで2つのアプリが処理される。

【マルチスレッドとは】
一つのアプリケーションが複数のスレッドを作成し、複数のコアで同時に処理させる事です。
その為、コア数が増えればアプリ自体の速度がアップします。

なので、あくまでも仮にですが、バッチ処理が「シングルタスク」「マルチスレッド」だった場合、12コアを使用して高速に処理されます。

>アプリを多重化したつくりにしないと、いくらコアがあっても一つの処理に使われるコアは一つだけという人
これが、マルチスレッドの事です。

>アプリは意識しなくともOSが自動的にコアに割り当ててくれるという意見の人
これが、恐らくマルチタスクの事を言ってるのだと思います。
但し、複数同時にアプリを起動した場合に他の処理待ちにならないだけで、複数のコアに処理を振り分けてくれるわけではありません。
あくまでも、一つのアプリが使用するのは一つのコアです。

バッチ処理は、「シングルタスク」で「シングルスレッド」です。
なので、結論から言えばコア1つの処理になります。

【マルチタスクとは】
複数のアプリケーションを同時に実行する処理の事です。
その際、シングルコアだと並列して処理するアプリケーションが順にスケジューリングされ、順番に処理されていきます。
なので、複数のアプリケーションが同時に実行出来ます。
※シングルタスクでは他のアプリが終了するまで、次のアプリは処理待ちになる。
また、マルチコアの場合はそれぞれのスケジューリングが複...続きを読む

Qlinuxでプロセスが動いているCPUナンバーを知りたい

linuxでプロセスが動いているCPUナンバーを知りたい
件名の通り、linuxでプロセスが動いているCPUナンバーを知りたいとおもっています。

psコマンドですと、プロセスID等はでますが、
デュアルコア、クワッドコアのどのcoreでプロセスが動いているのかを確認したいので
すが、表示できません。

なにか方法がありますでしょうか?

CPU(core)ナンバーとプロセスIDが結びつけば問題ありません。

mpstat -P 0

は使用率しかでなく、プロセスが見えませんでした。

よろしくお願い致します。

Aベストアンサー

Linux って, 各プロセスに対して常に同じコアを割り当てるんでしたっけ?
そうじゃないとすると「調べた時点での割り当て」はわかるけど, その次にはどうなってるかわからないからあんまり意味があるようには思えないのですが....

QTOPコマンドで表示するCPU使用率で100%以上の表示について

皆さんこんにちは。
TOPコマンドに関して、
分からないことがあり質問させていただきます。

特定のプロセスのCPU使用率が知りたく、
TOPコマンドに、grepをかけて、
そのプロセスのみのCPU使用率を見ていましたが、

「135.1%」とか、「120.9%」と、
100%を超える値を表示するプロセスがあるのですが、
これはどうしてか、
分からないでいます。

どなたか教えていただけるとありがたいです。
どんな要素が原因として考えられるものでしょうか?

OS:fedora9
CPU:Intel(R) Pentium(R) 4

Aベストアンサー

topで表示されるCPU使用率は、論理プロセッサ1台あたりのCPU時間を100%として計算されています。

ハイパースレッディングを有効にしている場合やマルチコアプロセッサでは、CPU使用率が100%を超えるのもさほど珍しい現象ではありません。

参考URL:http://codezine.jp/unixdic/w/top/

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

QUNIX上のプログラムで使うライブラリの中身を知る方法

過去にUNIX上で動作するプログラムを作成していて、その中で多数の.aや.so(標準では無く、オリジナルのもの。)を使っているのですが、.aや.so内にどのような関数があるのか、もしくはそのライブラリに関係するソース名は何か知る手段ってありませんか?
かなり前のものなので、関数仕様書もmakefileも無いため、何をライブラリとしているのか分からず困っています。
駄目もとで、バイナリエディタで中身を確認してみたのですが、何処の情報がそれを示しているかいまいち分かりませんでした。

Aベストアンサー

No.2 の方がご回答されているように、nm コマンドを使えばシンボルの一覧を表示できます。

(ex.1)
$ nm /usr/local/lib/libssl.so
U ASN1_INTEGER_get
U ASN1_INTEGER_set
U ASN1_check_infinite_end
U ASN1_dup
U ASN1_get_object
U ASN1_object_size
U ASN1_put_object
U BIO_callback_ctrl
U BIO_copy_next_retry
U BIO_ctrl
U BIO_f_buffer
00027db0 T BIO_f_ssl

ただし、U となっているものはライブラリ内で未定義のシンボル (変数や関数) であり、他のライブラリによって解決されなければならないものだったと思います。

また、ライブラリが strip コマンドによって strip されてしまっている場合はシンボルテーブルが削除されてしまうため確認できません。

(ex.2)
$ nm /usr/lib/libstdc++.so.5
nm: /usr/lib/libstdc++.so.5: シンボルがありません

No.2 の方がご回答されているように、nm コマンドを使えばシンボルの一覧を表示できます。

(ex.1)
$ nm /usr/local/lib/libssl.so
U ASN1_INTEGER_get
U ASN1_INTEGER_set
U ASN1_check_infinite_end
U ASN1_dup
U ASN1_get_object
U ASN1_object_size
U ASN1_put_object
U BIO_callback_ctrl
U BIO_copy_next_retry
U BIO_ctrl
U BIO_f_buffer
00027db0 T BIO_f_ssl

ただし、U となって...続きを読む

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qシェルスクリプトの実行、「source」と「.」の違いについて

bashのシェルスクリプトを書いています。
当方、Mac Snow Leopard を使っているため、seq コマンドがデフォルトでは使えません。
そこで、.bashrc 内に、seq 関数をあらかじめ自分で定義して、他で使い回したいと思っています。
.bashrc の中に、
function seq() {
i=$1
while [ $i -le $2 ] ; do
echo $i
let i=$i+1
done
}
と、関数を定義しました。
seq 関数をターミナル上で実行すると、
>seq 0 2
0
1
2
と正しく、表示されます。次に、

#!/bin/sh
seq 0 2

と記述したシェルスクリプト(temp.sh)を「source」で実行すると、
>source temp.sh
0
1
2
と正しく、表示されますが、「.」で実行すると、
>./temp.sh
./temp.sh: line 2: seq: command not found
と言われます。
どのような理由によってこの違いが出るのでしょうか??

bashのシェルスクリプトを書いています。
当方、Mac Snow Leopard を使っているため、seq コマンドがデフォルトでは使えません。
そこで、.bashrc 内に、seq 関数をあらかじめ自分で定義して、他で使い回したいと思っています。
.bashrc の中に、
function seq() {
i=$1
while [ $i -le $2 ] ; do
echo $i
let i=$i+1
done
}
と、関数を定義しました。
seq 関数をターミナル上で実行すると、
>seq 0 2
0
1
2
と正しく、表示されます。次に、

#!/bin/sh
seq 0 2

...続きを読む

Aベストアンサー

追記

source は現在のシェルで実行し、結果がそのまま現在のシェルに適応されます。
今回の temp.sh なら
> source temp.sh

> seq 0 2
と入力したのと同等ということになります。

> ./temp.sh
この . はコマンドではなく、 temp.shへのパスを指定するものです。
実行ファイル名だけでコマンドとして実行できるのは、環境変数PATHで指定したディレクトリにあるものだけです。それ以外は、その実行ファイルへの絶対パス、または相対パスが必要となります。
これは、カレントディレクトリにある実行ファイルも例外ではありません。
環境変数PATHに . が無い場合は、 ./ファイル名 と相対パスを指定する必要があります。
(この点は、常に . がPATHにあるように振る舞うMS-DOSやコマンドプロンプトとは違います)
逆に、PATH上にあれば(例えば、 PATH=$HOME/bin:(以下略)となっている時の $HOME/bin )、 temp.sh とファイル名だけで実行できます。

また、こうしたコマンドは新規プロセスで実行されますので、環境変数を除いて、現在の設定は継承されません。
対話的ではないbashや、 shとして起動された bash は .bashrcを読まないので、そこに書いてあることは無効となります。

追記

source は現在のシェルで実行し、結果がそのまま現在のシェルに適応されます。
今回の temp.sh なら
> source temp.sh

> seq 0 2
と入力したのと同等ということになります。

> ./temp.sh
この . はコマンドではなく、 temp.shへのパスを指定するものです。
実行ファイル名だけでコマンドとして実行できるのは、環境変数PATHで指定したディレクトリにあるものだけです。それ以外は、その実行ファイルへの絶対パス、または相対パスが必要となります。
これは、カレントディレクトリにある実行...続きを読む

QマルチコアCPUの負荷偏り

マルチコアCPUの負荷偏り
CPUの負荷をsar -P ALLで見ると1つのコアのみ負荷が高い場合が多いと思うのですが、これはなぜでしょうか?
また、解決する方法(すべてのコアに均等に負荷をかける)はあるのでしょうか?

Aベストアンサー

「1つのコアのみ負荷が高い場合が多いと思うのですが、これはなぜでしょうか?」
 ソフトがマルチCPUやマルチスレッドに対応していないからです。


「また、解決する方法(すべてのコアに均等に負荷をかける)はあるのでしょうか? 」
 ありません。なのでCore-iシリーズでは、複数のCPUに負荷が分散されていないときは、負荷の掛かっているCPUのクロックを上げる仕掛けになっています。

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html


人気Q&Aランキング