質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

2回答

1963閲覧

Linuxのカーネル空間にてメモリへのアクセス速度が異常に遅い

退会済みユーザー

退会済みユーザー

総合スコア0

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2020/07/01 15:09

編集2020/07/01 16:19

前提・実現したいこと

Linux PCでデバイスドライバ(カーネルモジュール)の動作確認をしています。

発生している問題・エラーメッセージ

PCによっては、カーネルモジュールのメモリアクセス速度が異常に遅い問題が発生しています。 原因としてどのようなことが考えらますでしょうか? 128MBデータを書き込むのにかかる時間:  PC#1: 6秒・・・問題!!  PC#2: 0.5秒 以下、PCの詳細です。 PC#1   CPU: Xeon Gold 6254(18core) x 2個   メモリ: DDR4 16GB 2933MT/s RDIMM(ECC Reg) x 6個   OS: CentOS7.7(64bit) PC#2   CPU: Core i7 x 1個   メモリ: DDR4 16GB x 1個   OS: Centos7.7(64bit)

該当のソースコード

C

1#include <linux/slab.h> 2#include <linux/module.h> 3 4#define GRUB_ADDRESS 0x800000000 //GRUBのアドレス(/etc/default/grubにて定義)・・・PCにより定義が異なります 5 6static int __init test_init(void) 7{ 8 //a.変数宣言: 8Byte 9 unsigned long long *data; 10 11 //b.変数初期化: GRUBのアドレスをioremapにて仮想アドレスで初期化 12 void* p = (void*) GRUB_ADDRESS; // Physical address 13 unsigned long long size = 1024*1024*1024; //1GB 14 data = ioremap_nocache( (unsigned long long)p, size ); // Virtual address 15 16 17 printk(KERN_INFO "loop start\n"); 18 19 //c.ループ: 数値をライト: 128MB分ループ 20 unsigned long long ii; 21 for( ii=0; ii<128*1024*1024/8; ii++ ){ //128MB 22 data[ii] = ii; 23 } 24 25 printk(KERN_INFO "loop end\n"); 26 27 return 0; 28} 29 30 31static void __exit test_exit(void) 32{ 33} 34 35module_init(test_init); 36module_exit(test_exit); 37

試したこと

  • 時間計測は、(c)のループ前後でprintkメッセージを出し、dmesgのタイムスタンプを利用しました。
  • メモリへのアクセス関数をiowrite32()に置き換えてみたりしたのですが、現象に改善は見られませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/07/01 15:22

> 128GBデータを書き込むのにかかる時間: 128MB?
退会済みユーザー

退会済みユーザー

2020/07/01 16:19

失礼しました。正しくは128MBでした。訂正しました。 ご指摘ありがとうございました。
dodox86

2020/07/01 23:07

思い付きなのでコメントのみですが、何らかの理由でドライバー内のループ時に他のカーネル部分の処理にCPU時間を奪われているのかもしれません。極端に高いネットワーク負荷とか、その他のI/Oとか。スピンロックなどの排他制御をして占有するようにすれば、状況が変わるかも、です。(長い時間の占有は危険がありそうなので、いきなり128MBではなく、少しずつ試してみてください)
dodox86

2020/07/01 23:23

あとはメモリ(ハードウェア)の差でしょうか。同期の問題とか、一部で不良が出てエラー訂正かかりまくりであるとか。memtest86 などでメモリをチェックすると何らかの報告があるかもしれません。 > DDR4 16GB 2933MT/s RDIMM(ECC Reg) x 6個
guest

回答2

0

PC#1って(Xeon、96GBのECCメモリと)PCというよりサーバーですね。NUMAが関係しているのでは?

投稿2020/07/05 03:07

sage

総合スコア1216

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

memset関数などを使ってみてください。あれは中身が半分アセンブラなどで高速化されているので、それで高速化する場合しない場合がありしないようですと、カーネルレベルのトラブルかも知れません。基本的に同じ作者チームが描いている初期化関数で初期化してみないと相性などがあるのでわかりません。

投稿2020/07/01 22:05

kokorohamoe

総合スコア190

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/02 07:59

ご回答ありがとうございます。memset関数につきまして、取り急ぎ結果の共有をいたします。 memset関数を使ってみましたが、速度は改善しませんでした。 >基本的に同じ作者チームが描いている初期化関数で初期化してみないと相性などがあるのでわかりません。 につきまして、もう少し具体的にご教示いただけましたら幸いです。
kokorohamoe

2020/07/02 13:04

memsetないしbzeroなどのカーネルチームが提供している関数で駄目となると、ちょっときちんと計算しないとわからないっぽいですね。for のループが結構な回数に成るので処理の問題かと思ったのですがカーネルチームが試験したものでもだめとなると本格的に確認するしかなさそうです。お力になれずすみません。 いろいろな原因が考えられますので私なら10や20のデータは取ってみて傾向をみて、アプローチしていきます。forの點せかたの問題ではなさそうなのでlong longをlongにかえてもだめっぽそうですね。 そうやって駄目に見えるものでもデータを収集して1つ1つ原因を洗い出していくしか無いと思います。機材や設定などに依存することの場合もあるのでわたしなら、そうやってアプローチしていきますとしか家なさそうです。お力になれずすみませんでした。
退会済みユーザー

退会済みユーザー

2020/07/03 03:27

詳細をありがとうございました。アプローチについてもコメントありがとうございます、大変参考なりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問