2012年3月30日 星期五

fuser defunct 為PHP5 BUG 耗損CPU 而產生殭屍程序的解決方式

這問題產生在 Ubuntu server 11.10 請修正編輯 /etc/cron.d/php5 更換程式碼如下:

09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -deleteNow everything works fine! :)


2012年3月29日 星期四

2012年3月26日 星期一

Windows XP 遠端桌面-多人遠端登入

緣由 : XP Pro 的遠端桌面只允許一個人連線,當其他使用者使用遠端桌面連線到 XP Pro 時,本機使用者會被強制登出。只要完成下列步驟,就可以解除這個限制,經實測確實可行 (測試機器為 XP Pro SP2 Vol 版本,本機主控台一個工作階段加上兩部電腦遠端登入)。

1. 將 Windows 啟動在安全模式。
2. 按一下 [控制台] 中的 [系統],取消選取 [遠端] 索引標籤中的
[允許使用者遠端連線 到這部電腦],然後按一下 [確定]。
3. 開啟 [控制台][系統管理工具][服務],將 Terminal Services 服務停用,
然後按一下[確定]。
4. 瀏覽到 C:\windows\system32\dllcache 目錄,將termsrv.dll 檔案改成
別的名稱 (例如 termsrv.original)。
5. 從 http://www.orbitfiles.com/download/id20947665 下載無連線數目限制
的 termsrv.dll,然後將它複製到C:\windows\system32\dllcache 目錄。
6. 瀏覽到 C:\windows\system32 目錄,重複步驟 4 與步驟 5
(將 termserv.dll 改成其他名稱,然後將剛下載的檔案複製到此目錄。
7. 開啟 [登錄編輯程式],找到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\
Terminal Server\Licensing Core 機碼。新增一個名為
EnableConcurrentSessions 的 DWORD 項目,將其值設定為 1,
然後關閉 [登錄編輯程式]。
8. 按一下 [ 開始][執行],輸入 gpedit.msc,然後按一下ENTER。
開啟 [電腦設定][系統管理範本][Windows 元件][終端機服務],
按兩下 [限制連線數目],選擇 [已啟用],然後在
[可允許的 TS 最大連線數目] 中設定想要的最大連線數目。
9. 重新啟動 Windows 在正常模式。
10. 按一下 [控制台] 中的 [系統],選取 [遠端] 索引標籤中的
[允許使用者允端連線到這部電腦],然後按一下 [確定]。
11. 開啟 [控制台][系統管理工具][服務],將 Terminal Services 服務啟動,
然後按一下 [確定]。
12. 重新啟動 Windows。

注意:

1. 您必須為使用者建立帳戶並將他加入 Remote Desktop User群組,
該使用者才能連線。
2. 您可能必須啟用「快速使用者切換」與「歡迎畫面」,按一
下 [開始][控制台][使用者帳戶][變更使用者登入或登出的方式]
以啟用上述兩個功能。
3. 此解決方案可能不適合已加入網域的電腦,因為網域群組原則可能
會覆寫本機群組原則。


資料來源:http://bubble727.pixnet.net/blog/post/4650800-%5Bwindows%5D%E9%81%A0%E7%AB%AF%E6%A1%8C%E9%9D%A2-%E5%A4%9A%E4%BA%BA%E9%81%A0%E7%AB%AF%E7%99%BB%E5%85%A5--windows-xp

2012年3月18日 星期日

2012年3月15日 星期四

舊款10/100MB集線器Switch與周邊GIGA設備傳輸不穩

最近客戶的D-LINK 舊款10/100MB Switch 連接GIGA設備,只要傳大量資料,整台就會掛掉,所以建議有相關問題的人,可以試著更新韌體或更換新款設備。

2012年3月11日 星期日

使用SCP 免密碼

假設想讓 B 主機上面免輸入密碼就能利用 ssh 登入 A 主機.
第一: 在 B 主機上使用以下指令產生 RSA key pair :
# ssh-keygen -t rsa

執行後相關訊息如下:
Enter file in which to save the key (~/.ssh/id_rsa):Enter
Enter passphrase (empty for no passphrase):Enter
Enter same passphrase again:Enter

public key 會放在 ~/.ssh/id_rsa.pub

(PS) :注意內容內的帳號名稱! 預設值大多產生root這帳號,因此做SCP的動作請改成所產生的內容帳號!

將B主機/.ssh/id_rsa.pub的內容,放進 A 主機的 ~/.ssh/authorized_keys的內容內。
設定即可完成,並且可以連線SCP動作而不需要KEY密碼.

2012年3月4日 星期日

調整Apache佔用CPU高使用率的問題

所謂Apache出現CPU高佔用率就是指Apache在一段時間內持續佔用很高的CPU使用率,甚至達到CPU100%,這個時候造成網站無法訪問。解決的方法就是仔細觀察Apache的日誌文件,查閱錯誤的信息。下面我們針對幾種錯誤信息進行分析並給出解決的方法: 1. Apache與Wi
所謂Apache出現CPU高佔用率就是指Apache在一段時間內持續佔用很高的CPU使用率,甚至達到CPU100%,這個時候造成網站無法訪問。解決的方法就是仔細觀察Apache的日誌文件,查閱錯誤的信息。
下面我們針對幾種錯誤信息進行分析並給出解決的方法:
1. Apache與WinSock v2相衝突
Apache官方提供的手冊中提到,在Windows系統下Apache2.x為了提高性能而使用了Microsoft WinSock v2 API,但是一些常見的防火牆軟件會破壞他的正確性,從而使得Apache出現死循環操作造成CPU100%。
其錯誤提示如下所示:
[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.
[error] (OS 10038) : Child 3356: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.
[warn] (OS 121)信號燈超時時間已到。: winnt_accept: Asynchronous AcceptEx failed.
[warn] (OS 64)指定的網絡名不再可用。: winnt_accept: Asynchronous AcceptEx failed.
可以依次採用下面的方法來解決上面的問題,如果進行了一步還有問題就繼續下一步:
1) 在httpd.conf文件中使用Win32DisableAcceptEx 禁止Apache使用Microsoft WinSock v2 API :
  1. <IfModule mpm_winnt.c>
  2. Win32DisableAcceptEx # 禁止使用AcceptEx()
  3. </IfModule>
2)使用System Repair Engineer(SREng)查看WinSocket供應者,如果出現非MS的陌生項則將其刪除,並使用軟件的“重置WinSocket”按鈕進行重置。
3) 卸載與Apache相衝突的殺毒軟件或防火牆軟件。
如果進行上面的三個步驟之後還有問題,那應該看看是不是還有下面的錯誤。
2. “Terminating 1 threads that failed to exit”錯誤
上面錯誤中的數字1有可能是其他數字,造成這個錯誤的原因是Apache在退出並發線程的時候出現線程溢出,從而造成內存洩露,表現出來的就是Apache所佔用的系統資源持續增長。
解決的方法也很簡單,將最大請求線程的值降低一些,但是也不能太低,太低的話會產生大量的請求隊列從而造成站點訪問緩慢。如果之前為0則將其設置為一個最大值。
  1. MaxRequestsPerChild 10000
3. “file .\\server\\mpm\\winnt\\child.c, line 1078, assertion “(rv >= 0) && (rv < threads_created)” failed” 錯誤
這個錯誤是Apache的一個bug(#11997),可以通過Win32DisableAcceptEx禁止Apache使用WinSocket v2來避免此bug,具體設置見前述。
4. PHP5.2.1以上版本的libmysql.dll與MySQL5不兼容
PHP5.2.1以後的新版本(截止目前最新版本為5.2.5)中用於連接MySQL的libmysql.dll組件與MySQL5不兼容,在Apache中運行PHP的時候會造成Apache產生CPU100%的問題。
解決的方法就是從http://www.php.net/releases/下載5.2.1版本,將壓縮包中的libmysql.dll文件覆蓋現在的文件,然後重啟Apache就可以了。
5.病毒或木馬程序命名為Apache.exe
有的時候病毒或木馬程序會將其名稱命名為Apache.exe文件達到一種掩飾的目的,這個時候使用第三方進程分析器查看進程的路徑然後將其刪除或使用殺毒軟件清除就可以了。
6.程序編寫不嚴謹造成死循環等錯誤
如果上面的問題都不存在Apache依然產生CPU100%的問題的話,通常來說就應該是Web程序自身的問題了,例如死循環等等。這個時候需要在日誌中設置HTTP請求的文件及執行的時間,然後查找出執行時間比較長的地址進行分析排查。
日誌格式設置如下:
LogFormat “%v %h %l %u %t [%Ts] \”%r\” %>s %b” vhost_common #設置程序執行時間
<VirtualHost xxx.xxx.xx.xx:80>
ServerName xxx.xxx.com
DirectoryIndex index.php index.html index.htm
DocumentRoot “xxx”
# cronolog.exe是Apache自帶的用於將日誌文件進行分割的應用程序
CustomLog “|bin/cronolog.exe e:/%Y%m%d.log” vhost_common
</VirtualHost>

對 Apache 連線數多 概念解析


今天說說Apache的最佳化。為什麼要最佳化?因為伺服器資源不夠用。資源有很多方麵,但根據木桶理論,只要有一種資源不夠用,整個伺服器的效能就會受到影響(所謂瓶頸)。
伺服器資源
那麼伺服器的資源包括哪些?對於網站來說主要是CPUTCP連線數這兩者。 CPU表現在工作數上,在Linux下使用平均負載(loadavg)來衡量。可透過以下指令來檢視(參考這篇文章):
cat /proc/loadavg
對於單CPU的伺服器,loadavg高於1,表明工作隊列出現了等待,CPU忙不過來了。超過2以上就會明顯感到效能降低了。
TCP連線數可透過以下指令檢視:
netstat -ant | grep :80 | wc -l
如果要即時監控伺服器資源,可參考OpenNMS項目。
注1:記憶體不算,低廉的價格使得網站伺服器很少有因為記憶體不夠而down掉的。
注2:CPU%是瞬時的CPU使用率,通常無法反映出整體負載。
Apache配置指令
Apache在資源方麵的配置指令主要有以下幾條。
KeepAlive是否允許持續連線
MaxKeepAliveRequests允許的持續連線的最大數
KeepAliveTimeout持續連線在沒有請求多少秒後切斷
StartServers最初啓動時啓動多少個伺服器處理序
MinSpareServers空閒伺服器處理序的最小數
MaxSpareServers空閒伺服器處理序的最大數
MaxRequestsPerChild每個子處理序處理的最大請求數
KeepAlive
前三個KeepAlive相關的指令用來設定持續連線。通常都是每個HTTP請求對應一個TCP連線,但對於一個包含許多圖片的網頁來說,用戶端會在瞬間發出多個HTTP請求,此時多次建立TCP連線會大大降低回應速度。此時透過持續連線,可以允許使用者在一個TCP連線中發出多個HTTP請求,減少TCP 連線建立次數,提高回應速度。
這種情況下,應當透過access_log統計出連續HTTP請求出現的次數、間隔時間、訪問量,以確定 MaxKeepAliveRequests 和 KeepAliveTimeout 的值。 KeepAliveTimeout 太小發揮不了持續連線的作用;太大了,持續連線遲遲不斷,浪費TCP連線數不說,更糟糕的是係統中的 httpd 處理序數目會因此不斷增加,使得係統負載升高,甚至會導緻伺服器失去回應。
但是在處理動態網頁請求時,由於使用者很少會瞬間請求多個動態網頁(一般都是開啟页面之後閱讀好半天才點下一頁),此時開啟KeepAlive無異於浪費TCP連線數。
結論就是,放動態網頁的就 KeepAlive Off 以提高吞吐量,放靜態內容如圖片、js程式碼等就 KeepAlive On 以減少TCP連線建立次數。
但一個Apache隻能有一種 KeepAlive 設定,怎麼辦?很簡單,弄兩臺伺服器,一個專門放指令檔,一個專門放圖片。
伺服器處理序數
再說說下麵的 StartServers、MinSpareServers、MaxSpareServers。 StartServers基本不用修改,因為Apache會自動調節子處理序數。 MinSpareServers和MaxSpareServers是空閒子處理序數目,何為空閒子處理序?假設某一時刻係統中共有30個httpd處理序,其中一個是父處理序,20個在處理請求,那麼空閒子處理序數就是9個。
空閒處理序少了,大量的突發請求會使伺服器疲於處理序建立,降低效率;而太多反而會增加係統處理序數,增大係統負載。
實際上,預設值已足夠處理一般的突發請求,所以除非是流量特別特別巨大的網站,否則不要修改這些設定。
就算流量特別特別大,也是透過負載平衡係統來降低每臺伺服器的訪問量,不會修改這幾個值。
MaxRequestsPerChild
這個值設定子處理序在處理多少個請求之後自動結束。這個選項是用來防止處理序由於記憶體泄漏等使用記憶體過多。一般預設值即可。
總結
說來說去其實最重要的還是 KeepAlive 的設定,而效能調節也就是調整 KeepAlive、KeepAliveTimeout 值。


更多内容 http://ssorc.tw/rewrite.php/read-907.html#ixzz1o6R3hEgX

Apache調教

打開apache2.2的錯誤日誌:
[Thu Feb 16 15:37:18 2012] [error] (OS 10038)在一個非套接字上嘗試了一個操作。  : Child 5316: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.
這個錯誤是CPU佔用率一直是100%
然後上網查了解決辦法:
httpd.conf文件中加入代碼:
<IfModule mpm_winnt.c>
ThreadsPerChild 1000
MaxRequestsPerChild 10000
Win32DisableAcceptEx
</IfModule>
重啟apache,發現
Cpu佔用率降下來了。
原因:apache2.0.49以上的accepteExwindows下出現這個問題。
[Thu Feb 16 16:49:10 2012] [error] (OS 10038)在一個非套接字上嘗試了一個操作。  : Too many errors in select loop. Child process exiting.
[Thu Feb 16 16:49:10 2012] [notice] Child 4216: Exit event signaled. Child process is ending. 
然後在dos運行命令netsh winsock reset再重啟apache
在瀏覽器裡面輸入localhost終於行了