🎉

アプリ実行環境の基礎(CPU/メモリ/コア/スレッド/NodeJS/Java)を復習する。

2023/01/09に公開

まえがき

システムの負荷の原因を切り分ける方法という記事を見ていて、

「WEBシステム開発してるけど、正直CPU使用率とかメモリ使用量とか数年前に受けた基本情報でしか目にしてないや....障害調査で確認しろってなったら何も分からんな(´_ゝ`)

「Java,NodeJS開発で使ってるけど、実際に動作する時プロセス/スレッドってどういう感じで動いてたっけ...」

となったので、改めて学び直す。

まず、プログラムはどう動く?

はじめに、プログラムが動く仕組みについて。
👉プログラムは命令の集合体なので【プログラムを実行する=命令を実行する】である。

登場人物 役割
プロセス 実行するプログラムのこと。
コア 「命令くれ!俺が実行する!」とスレッドから依頼を受けて、命令を実行する人
スレッド 「命令実行してくれ!」とコアにお願いする人

Windowsユーザであればタスクマネージャー > パフォーマンス > CPUにて、
現在実行されているプロセス数、スレッド数が確認できる。コア数については後述する。

この図だと、
・実行中のプログラムが283個。
・283個の各プログラムが生み出す命令をさばいてくれるスレッドが2899個。
ということになる。

自分のPC(Windows10)のCPU性能、メモリ容量を確認していく。

CPUとは

Central Processing Unitの略称。
・「中央処理装置」「中央演算処理装置」と呼ばれる。
・コンピュータの脳みそ。
・後述するコア クロック数等がCPUの性能に該当する。

タスクマネージャー > パフォーマンス > CPUにて、CPU性能を確認できる。

🔴コア

スレッドから依頼を受けた命令を実行する人である。
【コア数が多い=命令を実行できる人が多い】なので、プログラムを実行する環境として優秀ということになる。今回だと4個のコアが搭載されている。

🔴ロジカルプロセッサ

コンピュータから見たときに存在するように見えるCPUのコアのこと。
今回だと物理的なコア数は4つだが、論理的には8つ存在するようになっている。

参考: 論理コアとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

🔴Intel Core(TM) i7-1065G7

🔵Intel Core

Intelが発売しているCPUのこと。

🔵i7-1065G7

Intel Coreには13世代(2022年末時点)存在し、i7-1065G7は第10世代。

参考: 【Intel CPU】Core i9, Core i7, Core i5, Core i3の世代の一覧・見分け方のまとめ

参考: 【第12世代の今】Core i5とi7のどちらを選ぶべきか問題を解説

よく比較されるCore i5 と i7では、Core i7の方がコア数が多いため性能も上とのこと。
スレッド数など性能に関わるものは他にも色々あるがここでは一旦割愛。

🔴1.30 Ghz

クロック数のこと。

🔵クロック数(クロック周波数)

👉クロックとは、CPUが処理を行う際に発する信号(単位:Hz)のこと。
  この信号(クロック)が発せられることで命令が実行される。
👉クロック数とは、1秒間に発することができるクロックの回数。

1命令を実行するのに平均4クロックかかる。
1クロックに1ナノ秒かかる=1秒間に10^9クロック発する。

という感じ。ここは応用情報の問題が理解するのに参考になった👍

参考: 応用情報技術者平成22年春期 午前問10

メモリ

・メモリ:CPUが処理を実行するためのデータを一時的に記憶する場所である。

タスクマネージャー > パフォーマンス > メモリにて、メモリ容量を確認できる。
・今回だと15.6GBがメモリ総容量となっている。

Linuxサーバにて、CPU使用率、メモリ使用量を確認してみる。

Windows10ではタスクマネージャーで分かりやすく確認できた。
実際にアプリをデプロイするLinux環境の場合でも、CLI経由でCPU使用率とメモリ使用量を確認してみる。

CPU使用率

topコマンドを使えば、実行中の各プロセスのCPU使用率を確認できる。

参考:topコマンドの使い方

メモリ使用量

topコマンドを使えば、実行中の各プロセスのメモリ使用率を確認できる。

参考:topコマンドの使い方

HTTPサーバ(Apache)、NodeJS、Java実行環境における動き

HTTPサーバ(Apache)

✅Apacheは1リクエスト1プロセス生成
 → 各リクエストが同期処理なので、外部IO処理待ち状態=プロセス消えずに待機。
 → 何万リクエストを同時に受けられない△

NodeJS

✅NodeJSは「シングルプロセス・シングルスレッド・非同期I/O」で設計されたもの。
 → NodeJSは全リクエストを1プロセス1スレッドでさばく。
 → ファイルアクセスや通信などのCPUを使わない処理は非同期で行われ、
   処理が終わったらコールバック関数が呼ばれる

参考: いまさら聞けないNode.js

Java

✅Javaは1プロセス(JVM)上で同時に複数スレッド生成(マルチスレッド)
✅APIの場合、JVM上でTomcatを起動する。(*SpringBoot=組み込みTomcat起動)
 → 1リクエストに対してTomcat上で1スレッド生成される。
 → 各リクエストが同期処理なので、外部IO処理待ち状態=スレッド消えずに待機。

Discussion