ʍoɹɐɥsのブ口グ

ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็็็็็็็็็็็็็็็ ส็็็็็็็็็็็

温度センサの値をブラウザから見れるようにする(3)

f:id:sharow:20150622093125p:plain

10日を過ぎた頃、案の定データが増えてきたことによるパフォーマンス上の問題が発生した。大きく2つで、前者は予想はしていた。

  • グラフデータのレスポンスが遅い
  • グラフの描画が重い(ブラウザ側)

グラフデータのレスポンスが遅い

そんなにできることはなくて、とにかくキャッシュする。Redisを使おうと思っていたのだけど、Redisを使うまでもなく、uwsgiにはキャッシュ用の簡易KVSが組み込んであるのでそれを使った。最終的なJSONのデータは10分後には確実に更新されるので、数分しかキャッシュできない。あとは日ごとの温度データのpickleのキャッシュ。こちらは今日以外はすべて不変なデータなのでどんどんキャッシュできる。不変データばんざい!・・が、結局それらを束ねてNVD3の仕様のJSONデータにするのにも結構時間がかかっている。0.5秒~1秒くらいの話だけど、データが10倍になると消費時間も10倍かそれ以上になるのでもうちょいキャッシュの仕方やデータの加工タイミングを工夫しないとダメそう。

ましかし、キャッシュが最大限に効くとケタ違いのレスポンスを返してくれるのでやりがいがある。

f:id:sharow:20150622094548p:plain

まだキャッシュは期限式のものしか使っていない。LRU式も使いどころがあれば応用してみたい。Python3.2以降ならfunctools.lru_cache()で簡単に使える。まだ使ってない理由は、LRUによくないパターンでアクセスされるので、どうしたものか悩んでいるから。 (追記:それ以前に、uwsgiは暇だとPythonプロセスを殺すようにしてるので、プロセスレベルでキャッシュしてもあまり意味無いことに気付いた…)

グラフの描画が重い

まったく予想してなかった。NVD3はDOM的にはSVG、これはデスクトップ(media≒screen)ではソフトウェアレンダリングになるので3.6GHzのマシンでもかなり重い。skiaエンジンのChromeでも重い。

Windows環境においてハードウェア支援のOpenVGなどはまったく普及していないと思ってる。そんなハードウェア/実装があるのかすら知らない。下手するとOpenVGのハードウェア支援が効いてると思われるiPadなんかの方がパフォーマンスがいいんじゃないか、と思ったりもする。

解消法はもう、データを少なくするか、NVD3から他のに乗り換えるかしかない…。どうしよう。