トップ 最新 追記   RSS 1.0 FEED  

Journal InTime


2014-06-28 (Sat) [長年日記]

_ Ubuntu 14.04へのアップグレード

長らくUbuntu 12.04を使っていたが、重い腰を上げて14.04にアップグレードした(ついでに32bit版から64bit版にしたかったので、正確にはVMのイメージを作り直した)。

インストールは問題なかったが、使い始めるといくつかの問題が…。

  • compizのCPU使用率が高い。→ gnome-session-flashbackを入れてGnome Classicを使用することに。
  • Emacsのバージョンが上がって、T-Codeが動かなくなった。→ 後述の設定で回避。
  • Emacsのバージョンが上がって、insert-signatureがなくなった。 → とりあえずmime-edit-insert-signatureを使用。
  • kb2mb2の起動時にX Error of failed request: BadAccessと言われてこける。 → とりあえず放置。

T-Codeの件については、last-command-charがなくなったせいでgithubの最新のコードでも問題があったので、.emacsに以下のようなコードを入れて凌ぐことにした。

(defmacro advice-last-command-char (commands)
  `(progn
     ,@(mapcar
        (lambda (command)
          `(defadvice ,command (around ,(intern (concat (symbol-name command) "-last-command-char")) activate)
             (let ((last-command-char last-command-event))
               ad-do-it)))
        commands)))

(advice-last-command-char (eelll-key
                           isearch-printing-char
                           isearch-printing-char
                           isearch-printing-char
                           tcode-2byte-alnum-input-method
                           tcode-2byte-alnum-self-insert-command
                           tcode-mazegaki-complete
                           character-to-event
                           isearch-last-command-char
                           tcode-electric-space
                           tcode-insert-ya-outset
                           tcode-katakana-preceding-chars))

defadviceとdefmacro便利。

7/1追記:

insert-signatureについては、.emacsに以下のような設定を追加すれば定義された。

(setq mime-setup-use-signature t)
Tags: Ubuntu

2014-06-29 (Sun) [長年日記]

_ RedisのPub/Subの遅いsubscriber問題

RedisのPub/Subを試していて、subscriber側の受信が遅いとredis-server上のキューが伸び続けて、メモリ使用量が増大し続けてしまう問題にはまった。

以下のようにひたすらpublisher側でひたすらデータを送るようにしておいて、

require "redis"
require "json"

redis = Redis.new(timeout: 0)

redis.subscribe("foo") do |on|
  on.message do |channel, msg|
    i = msg.slice(/(\d+):/, 1)
    p i
    sleep(1.0)
  end
end

subscriber側で以下のようにsleepすると、どんどんredis-serverが太っていく。

require "redis"
require "json"

redis = Redis.new(timeout: 0)

redis.subscribe("foo") do |on|
  on.message do |channel, msg|
    i = msg.slice(/(\d+):/, 1)
    p i
    sleep(1.0)
  end
end

調べてみると、Redis 2.6以降ではバッファサイズの上限を指定でき、上限に達したクライアントは切断されるようだ。

たまたまUbuntu 14.04に上げたところだったので確認すると、redis-server-2:2.8.4-2では最初からredis.confで以下のように設定されていた。

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

この環境で上記のスクリプトを試すと、たしかに以下のように切断される。

$ ruby sub.rb
"0"
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"1681"
"1682"
"1683"
"1684"
"1685"
"1686"
"1687"
"1688"
"1689"
/home/shugo/local/lib/ruby/gems/2.2.0/gems/redis-3.1.0/lib/redis/client.rb:233:in `rescue in io': Connection lost (ECONNRESET) (Redis::ConnectionError)

番号が飛んでいるところを見ると、上限に達してもすぐに切断されるわけではないようだ。

結論: ソフトウェアに何か問題があったらとりあえず最新版を確認しましょう。


2014-06-30 (Mon) [長年日記]

_ InfluxDBの古いデータの削除

InfluxDBを試しているが、InfluxDBには今のところ古いデータを自動で削除する機能がない(対応予定はあるようだ)。

古いshardを丸ごと削除するのが効率がよいらしい(InfluxDBでは一定期間ごとにshardが作成される)ので、以下のようなcron用スクリプトを書いてみた。

require "influxdb"

USER = "root"
PASS = "root"
TTL = "1d"

def parse_ttl(ttl)
  case ttl
  when /\A(\d+)s\z/
    return $1.to_i
  when /\A(\d+)m\z/
    return 60 * $1.to_i
  when /\A(\d+)h\z/
    return 60 * 60 * $1.to_i
  when /\A(\d+)d\z/
    return 24 * 60 * 60 * $1.to_i
  else
    raise "invalid TTL - #{ttl}"
  end
end

secs_to_live = parse_ttl(TTL)
influxdb = InfluxDB::Client.new

for shard in influxdb.get_shard_list["shortTerm"]
  end_time = Time.at(shard["endTime"])
  if Time.now - end_time > secs_to_live
    influxdb.delete_shard(shard["id"], shard["serverIds"], USER, PASS)
  end
end

InfluxDBでは小文字で始まる名前のseriesは短期間(short term)、大文字で始まる名前のseriesは長期間(long term)と決まっているが、上記のスクリプトでは短期間のshardだけ削除するようにしている。

ただ、デフォルトでは各shardの期間が7日間になっているので、それよりも短い期間でshardを削除する場合は/opt/influxdb/shared/config.tomlの設定を以下のように変更しておく必要がある(この例では6時間に設定している)。

[sharding.short-term]
duration = "6h"

/opt/influxdb/current/config.tomlの方を変更しても反映されないので注意。

Tags: Ruby InfluxDB