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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

2回答

2174閲覧

raspberry piによる連続的・並列的な高速メッセージ配送の方法について

yosera45

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2018/10/09 12:06

編集2022/01/12 10:55

前提・実現したいこと

raspberry piで、ある測定を行い、得られる測定データの中でフィルタ条件を満たすものを、その都度、リアルタイムに通知したい。

・測定データは特定のフォーマットのテキストデータであり、軽量でメールに載せられます。

・測定データがフィルタ条件に一致するかの判定は、各測定データに対し、マルチスレッドを起動しており、同時並行的です。これを大量に取得される測定データに対して行い、フィルタ条件を満たすときは、メール通知しています。つまり、メール通知までもマルチスレッド化してます。

・メール通知までの一連のタスクの混雑の具合を見るため、
測定データの取得時刻と、それに対応するメールが作成完了する時刻も載せています。

・通信経路は暗号化を要求するので、現状ではpgpのメールで対応していますが、
メールを一件ごとに開く必要があり、使いづらいです。
そのため、表示を自由に変更可能なサーバに変更し、tlsへ移行するつもりです。

・rpi外のネットワークの品質には問題ないとします。

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

上記のメッセージ配送の仕様のため、非力なrpiでは、短時間に連続でフィルタ条件を満たす測定データが取得されるとき、一気に大量のタスクキューがたまるためか、
それらの通知を見ると、測定データの取得時刻とメールメッセージ作成時刻が1,2分空いてしまっており、リアルタイム性がないです。

これは、rpiで大量のタスクキューを発生させた事が原因なのか、
1回のメール作成が負荷の原因であり、その他のメッセージ配送プロトコルを利用すれば改善されるかは不明です。

rpiのネットワークの遅延は問題ないので、rpiのcpuの問題です。

試す前にどのような機能を用いるべきか。

軽量のメッセージプロトコルとして,mqttやnanomsg,zeromqを考えています。
測定データを送信するrpiと、それを受信してwebアクセスしたユーザーに自由な形式(グラフとか)で表示するサーバのため、実質的には二者間通信であり、、ブローカーレスな構成です。

しかし、軽量のメッセージプロトコル以前に、例えば、最近5秒以内のフィルタ条件を満たす測定データはまとめて通知する、という方法にすれば、通知回数を減らして負荷を減らせるのでは、という期待もあります。(もちろん、遅延が最低でも5秒存在する事にはなるが)そのため、httpsでpost送信で対応すればよいのではとも考えました。

補足情報(FW/ツールのバージョンなど)

raspbian (stretch)
python 3.6

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

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

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

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

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

guest

回答2

0

「rpiのcpuの問題です」といってもRaspberry PiのCPUを取り替えたり、クロックを上げたりする訳にはいきませんから、ソフトウェア的な解決方法をとるしかないと思います。

まずは状況を把握するために、スレッドおよびタスクの生成時刻、消滅(完了)時刻、をログとしてメモリに記録してみてはどうでしょうか。(メモリ一杯までログが溜まったらプリンタなどに出力して内容を確認する)

また、個々の処理(測定データの取得、フィルター処理、pgpの暗号化、など)をシングルスレッド(他のスレッドは存在しない状態)で実行してみて、一連の処理に必要な時間を把握すべきだと思います。

raspberry pi側の状況把握をふまえて、ネットワークによる通信に関する検討を始めても遅くないのではないでしょうか。

P.S.
高負荷のRaspberry piの処理速度を上げる(温度上昇によって生じるCPUクロック速度低下を抑える)には、冷却能力の高いケース、大型のヒートシンクや冷却ファンを使うことが有効なようです。
ハードウェア的な対処方法として追記しておきます。

投稿2018/10/24 01:35

coco_bauer

総合スコア6915

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

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

0

質問内容を完全に把握していないのですが、Raspbianで普通に使える、セキュアでリアルタイム性がある軽量プロトコルといえば、WebSocketですね。

自由度が高いので、複数メッセージをまとめる等どの様にでも実装できますが、メッセージをまとめなくても、どの様に実装しても、置き換えればpgp+smtpよりは相当改善されると思います。

投稿2018/10/11 15:29

ahidaka

総合スコア391

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

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

yosera45

2018/10/20 13:46 編集

websocketを調べると、どうやら、なんらかのデータ(測定データや株チャート等)をサーバー側で保持し、グラフのリアルタイムな変動を見たいクライアントとの通信で利用されているようです。 とりあえず、pythonのwebsoket関連のモジュールで測定データ送信のプログラムを実装しながら、 回答をお待ちいたします。 つまり、websocketの処理について、サーバ側はpythonでも良いが、クライアント側はwebアクセスとしてjsを利用しています。 こうなると、rpiからサーバへの測定データ送信はサーバへのjsによるアクセスとなるのでしょうか? そうなると、pythonならjs利用可能なヘッドレスブラウズなどによる処理の重い実装になります。 なので、rpiからデータ受信サーバへの通信は本来はwebsoketの役割ではないように思えるのですが、どうなのでしょうか。 それとも、以下の三者間 rpi -> 測定データ受信兼整形表示サーバ -> client のそれぞれで、websoketを使うと良いということでしょうか? websocetとともにasyncioが使用されているあたり、測定データの送信を素早く非同期にできるという意味ではこちらもありなのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問