What have you found for these years?

2008-12-18

多災多難的 redmine...

而且好像所有的問題都是 rails 造成的喔?

一開始先是不小心用到 PStore 做 session, 結果 /tmp 被塞爆,
幾億個 session 塞在那裡,哪個程式只要讀到 /tmp 就會完全卡住。
參考:之前 redmine 停擺的狀況
結果 production log 就大暴走,瞬間腫大塞滿硬碟...

暴力清掉 sudo rm -rf /tmp 之後硬碟空間居然不會恢復! @@
還要 reboot 一次... 這真的是嚇死我了,還以為硬碟出現黑洞...

後來 production log 又常常腫大,不勝其擾,又懶得寫 cron 定時清理,
乾脆把 error log 改成 :fetal, 這就算解決 log 肥大的問題。

結果奇怪的是硬碟還是一天比一天少啊! @@
到了剛才甚至發現完全沒空間剩下了!

godfat@godfat > df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 9.4G 8.9G 1.5M 100% /

godfat@godfat > du -h /
[snipped]
3.0G /

這還是 reboot 過後的結果 XD 一囧之下就又寄信問 slicehost orz.
很快就回信了,但果然這種問題還是需要我自己解決... 唉,太衝動了,
只是因為覺得實在太囧,而且他們回信一直都很快也很親切 XD 就忍不住...

找半天想查看 postgres 的 log 時才忽然想到,我只用 du 是沒有權限
調查 postgres 的 database @@ 趕快 sudo 跑跑看...
godfat@godfat /h/postgres> sudo du -h
5.9G .


棍!!!!果然全部藏在這裡 orz

這樣我才忽然想到,rails 的 session 不會自己清理...
而且,這個問題我明明就碰過很多次了 @@ 那為什麼剛剛一直沒想起來?
一方面可能是因為很疲倦所以變笨了,另一方面則是,我認為這問題太蠢了。
我實在很難想像一個很有名很多人在用的 framework 直接架起來,
還要定時手動去清垃圾。這不是一定會碰到的問題嗎?為什麼沒有內建!?

不知道 merb 有沒有處理這個問題?

然後就是因為這超大的 session, 別說 AR 沒反應了,連 DM 也沒反應。
不管是 Session.delete_all 或是 Session.all.destroy!
或是 while s = Session.first; print '.'; s.destroy!; end
第三個頂多印出三個點,然後整隻程式就卡住了 @@

開 top 看,好像有在跑,但又不知道他在跑什麼...

一開始 postgres 先會吐出這個 message:

LOG: checkpoints are occurring too frequently (5 seconds apart)
HINT: Consider increasing the configuration parameter "checkpoint_segments".

亂改了設定後就不會跳出這個訊息,但是都會跳出:

LOG: could not send data to client: Broken pipe
LOG: unexpected EOF on client connection

然後 ruby 就不會動了。接下來不管怎麼呼叫,Session.first 都會是 nil @@
於是想說這樣非得下 sql 才行了。

Session.find_by_sql('TRUNCATE TABLE sessions')

一樣跳訊息,然後就死掉... 其實也不知道這樣到底對不對?
因為用 psql 進去之後,TRUNCATE 怎麼下都告訴我沒有這個 relation...

ERROR: relation "redmine.sessions" does not exist

不然就是:

ERROR: schema "redmine" does not exist

甚至是:

ERROR: cross-database references are not implemented: "redmine.public.sessions"

真要翻桌了,google 也找不到什麼東西 @@
問題是現在也沒耐心去看 postgres 的 database 和 schema 有啥差別?
想說只要一行就好啊,為什麼沒有範例...
mysql 好像是用 USE 來選 database, postgres 看半天找不到相應的。

\dn 看 list of schemas, \l 看 list of databases,
啊又忘記 database 跟 schema 的層級,那 public 又是什麼?

最後換個搜尋方式,找 postgres select database 才發現,
原來是 psql redmine 這樣進去 redmine database........
也是啦,連線之後切換 database 是一件有點怪的事。

這麼說來,mysql database 大概等同於 postgres schema 吧。
postgres database 則是再高一個層級的東西,或許可以看成一個
mysql server? 所以 postgres 本身就是 cluster... 之類的。
覺得快昏倒了胡言亂語莫介意...

於是下了:

redmine=# TRUNCATE TABLE public.sessions;

終於沒錯誤訊息!顯示:TRUNCATE TABLE

然後咧?我很納悶。因為執行這個不到一秒鐘... 一瞬間就有回應了。
跟剛剛 ruby 一直卡住的落差很大。我甚至打定放一晚讓他跑的心理準備。
(不知道怎麼登出跑 background job... 之前刪 /tmp 就是這樣...)

跳出來看了一下:
godfat@godfat /h/redmine> df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 9.4G 2.7G 6.3G 30% /

hurray!!

==
TRUNCATE 應該做進 data_object 的...
all.destroy! 就應該喚起 TRUNCATE...

==
唉,本來晚上想把下午的東西收尾或是弄點別的,
結果都在搞這個... 而且又搞到這麼晚,除了眼睛快張不開了以外,
感覺也隨時都快睡著了。昨天就已經有眼睛快累死的感覺,結果今天居然又一次...
也正好拿去彌補前幾天的爛事好了。這樣想的話倒是還覺得好接受些。

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0