« 光るLチカハンドスピナー、できました | トップページ | ZYNQ搭載ADC/DAC基板が届いた »

2017.11.07

PythonのXMLRPCが遅くなった原因

ZYNQ+ADC+FPGAボード「Cosmo-Z」のUbuntu LinuxでPythonが動くようにして、ホストPCから操作する実験を行ってしました。

久しぶりにホストPCからリモートプロシージャコールでアクセスしてみたところ、すごく遅くて我慢できないほどでした。

作ったコードはこんな感じです。

# encoding:utf-8
# Cosmo-ZをTCP/IPでリモート操作するよ!
 
import sys
 
server="cosmoz3"
import xmlrpc.client as xmlrpc_client# XMP-RPCを使用する

# サーバに接続
print "Connect serer.."
cosmoz = xmlrpc_client.ServerProxy('http://' + server + ':21068')
 
# Cosmo-Zの操作
cosmoz.open() # Cosmo-Zをオープンする
cosmoz.adc_reset() # ADCをリセット
 
print "xadc=" + str(cosmoz.xadc()) # FPGAの電圧と温度を表示
 
adc_vrange = cosmoz.adc_vrange() # ADCの電圧範囲の取得
adc_info = cosmoz.adc_info() # ADCの情報を取得
maxch = cosmoz.maxch() # ADCのチャネル数を取得
cosmoz.adc_setfreq(freq) # サンプリング周波数の設定
 
cosmoz.trig_set(8,"fall",2000) # トリガの設定
cosmoz.trig_ortrig("or") # グローバルトリガの設定
・・・

実際にやってみると、cosmoz.***()の関数を1つ呼ぶたびに1秒くらいの時間がかかります。

前はこんなに遅くなかったはずなのですが、いったい、どこに間違いがあるのでしょうか?

WireSharkでパケットを取ってみました。

Rpc1

ホストPC→Cosmo-Zへリクエストを出して、Cosmo-Z→ホストPCへレスポンスを返すという図式なのですが、Cosmo-Z上で動いているPythonの反応は数ms~数十msで、それほど遅くはありませんでした。

パケットをよく見てみると、192.168.2.9(Cosmo-Z)が192.168.2.87(ホストPC)へ応答を返したあと、ホストPCが次のパケットを出すまでに300msくらいかかっています。(↑の図の赤い線の部分)

このとき、ホストPCはマルチキャストのアドレスにLLMNRというのを4回投げています。

LLMNRというのは、DNSやNetBIOS over TCPに変わる新しい名前解決の仕組みのようで、比較的最近のWindowsで導入されているようです。LLMNRのリクエストを出したのに、応答がないからホストPCがそこで待ってしまっているということのようです。

ためしに、Pythonのスクリプトの

server="cosmoz3"

というのを

server="192.168.2.9"

に変えてみたところ、LLMNRが出なくなって見違えるように速くなりました。

Rpc2

↑IPアドレスを直接指定したら、確かにLLMNRが出なくなりました。

ホスト名を利用した通信でLLMNRを出さないようにする方法は、まだわかりません。ホスト名.localでもLLMNRは出てしまいます。ホスト名を使うと遅くなるというのは、ちょっと面倒ですね。

あと、以前実験したときは、ZYNQ Linuxの上でavahi-daemonという名前解決が動いていて、これがTCP/IPの通信をするたびにマルチキャストのパケットを出すので、遅くなってしました。それが下の図です。

Py3 

この実験を行ったときに、クライアント(ZYNQ Linux)の上ではavahi-daemonを止めるようにしたのですが、それが今回遅くなった原因かと思ったのですが、Avahi(mDNS)とLLMNRは違うプロトコルなので、そうではないようです。

結局のところ、

  • クライアント(ZYNQ Linux)ではAvahiを止める
  • ホスト(Windows)ではLLMNRが出ないように名前を使わない

としたところスピードは上がったのですが、何か間違っている気がします。

sun

ZYNQで計測した波形をXML-RPCを通じてPythonで取得してnumpyでグラフにするということが結構な快適さでできるようになりました。

Rpc3

あとは、最新の名前解決を勉強して両方ともスマートに解決できる方法を探したいと思います。

■追記

  • Windowsがavahiに応答するようにするには、Bonjourをインストールすればよい

|

« 光るLチカハンドスピナー、できました | トップページ | ZYNQ搭載ADC/DAC基板が届いた »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 光るLチカハンドスピナー、できました | トップページ | ZYNQ搭載ADC/DAC基板が届いた »