2010年12月5日 星期日

core dump 命名設定

往往每一發現core dump產生, 系統預設產生檔名為core.pid, 還得由log去查看是哪支程式的pid, 實在很不直覺化

首先, linux針對code dump的命名設定, 參考於/proc/sys/kernel/core_pattern

$> more /proc/sys/kernel/core_pattern


預設值為"core", 可使用的命名變數如下:
%p : pid
%% : output one %
%u : uid
%g : gid
%s : signal number
%t : time of dump
%h : host name
%e : executable filename
% : % is dropped
% : both are dropped


個人習慣core dump可以得知哪支程式產生, 所以命名式為 "core.%e.%p"
$> echo "core.%e.%p" > /proc/sys/kernel/core_pattern

$> vi /etc/sysctl.conf
kernel.core_pattern = core.%e.%p

以上大功告成!!

2010年12月4日 星期六

connect() raise No route to host and recv() raise Resource temporarily unavailable

當client socket 與 server 正常連線下, 中繼switch的網路線被短暫拔插時..
(1) close client socket
正常程序client socket當send(), 會偵測到網路已斷開, 此時須close()
(2) try to connect to server
正常程序client socket會試著建立新連線, 但由於switch須一段時間才會恢復,
connect()會引發ENETUNREACH (No route to host), 表示無法順利連線,
此時建議sleep()數秒, 再試著重新connect(), 直到成功建立連線
(3)send alive mssage and recv ack
正常程序client socket成功建立連線後, 會試著send() alive massage,
並recv() ack, 以表示雙方ap已確立建立連線..
若recv() with non-block, 猜測server此時重新binding socket,
recv()會引發EAGAIN (Resource temporarily unavailable),
表示sokcet無任何資料可以讀取, 建議捨棄此次alive massge作業,
sleep()數秒, 再進行一次send() alive message,
亦或是, sleep()1秒, 再進行recv() ack, 若重覆3次, 依舊無資料可讀取,
捨棄此次alive massage作業, sleep()數秒, 再進行一次send() alive message

man recv ::

If no messages are available at the socket, the receive calls wait for a message to arrive, unless the socket is nonblocking (see fcntl(2)), in which case the value -1 is returned and the external variable errno set to EAGAIN. The receive calls normally return any data available, up to the requested amount, rather than waiting for receipt of the full amount requested.

2010年2月18日 星期四

當VMWare出現"The Virtual Machine appears to be in use..."

當執行VMware時, 偶發一次發生出現這樣的訊息, "The Virtual Machine appears to be in use..."
其guest os再也無法開機, 原來它會建立lock file or lock path,
一旦偵測有其lock file path存在, 便不會讓相同的guest os重覆執行, 是種保護機制,
所以依照下述步驟, 便可解除這樣的問題:

1. 進入virtual machine安裝guest os的資料夾
2. 將*.lck的資料夾, 重新更名為其它名稱, 亦或者將它們刪除
3. 重新啟動guest os

2010年2月13日 星期六

調整TCP TIME_WAIT, 快速釋放連線資料

在參閱TCP TIME_WAIT的釋義一文後,
了解到系統須等待2MSL時間, 才進入CLOSED狀態, 關閉連線
在linux RedHat AS4中, 執行$>netstat -tnao, 會發現到,
主動斷線端處理TIME_WAIT後, 須等待60秒, 才會真正關閉連線

哪有什麼方式可以縮短TIME_WAIT的等待時間呢??


方法一.

$> vi /etc/sysctl.conf

## 表示開啟重用機制, 允許socket在TIME_WAIT狀態下, 重新bind新的socket
net.ipv4.tcp_tw_reuse = 1
## 表示開啟回收機制, 允許socket在TIME_WAIT狀態下, 被快速回收, 毋須等待2MSL
net.ipv4.tcp_tw_recycle = 1

$> /sbin/sysctl -p ## 使上述設定生效

方法二.
## 查看系統預設TIME_WAIT時間
$> more /proc/sys/net/ipv4/tcp_fin_timeout
## 修改系統預設TIME_WAIT時間
$> echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

方法三.
在setsockopt()時, 設置SO_LINGER之屬性,
linger.l_onoff 表示開啟延遲功能
linger.l_linger 表示延遲時間為0秒
struct linger opt_linger = { 0,0 };
opt_linger.l_onoff = 1;
opt_linger.l_linger = 0;
if (::setsockopt(SSock, SOL_SOCKET, SO_LINGER, (const char *)&opt_linger, sizeof(linger)) == -1) {
ap_log (ERROR, "setsockopt(LINGER) fail");
return false;
}