上一篇: 【門戶網(wǎng)站建設(shè)的報(bào)價(jià)】繪制圖像區(qū)域的左上角的畫布坐標(biāo)

網(wǎng)站建設(shè)手機(jī):增加Squid進(jìn)程的FD限額
這里可見ngx_http_parse_header_line函數(shù)中的內(nèi)部變量p保存了請(qǐng)求體的部分內(nèi)容。
如果使用$$locals$,可以看到每次輸出(實(shí)際就是ngx_http_parse—header.line讀取請(qǐng)求體
的過(guò)程)p的內(nèi)存地址自增一次,然后在某一時(shí)刻突然中斷。我們計(jì)算自增數(shù),就知道是
在請(qǐng)求體的第幾個(gè)字節(jié)處發(fā)生問(wèn)題了。
最后在這個(gè)出問(wèn)題的請(qǐng)求的對(duì)應(yīng)字節(jié)處發(fā)現(xiàn)了一個(gè)\0,引發(fā)了舊版本Nginx的
NGX_HTTP_PARSE_INVALID_HEADER判斷。
1.3.8.3.5 增加Squid進(jìn)程的FD限額
Squid在啟動(dòng)的時(shí)候,會(huì)根據(jù)當(dāng)前shell的ulimit限制來(lái)設(shè)置自己的rlimit,默認(rèn)情況
就是只能打開1024個(gè)FD。這在大流量的情況下顯然是不夠的。而Squid又不像Nginx那
樣提供了配置參數(shù),只能在啟動(dòng)前修改好當(dāng)前登錄shell的ulimit-這種操作顯然是很容
易被遺忘的。因此我們應(yīng)該通過(guò)自動(dòng)化手段避免它。
但是無(wú)法避免的是已經(jīng)啟動(dòng)的進(jìn)程,這時(shí)候我們也可以想辦法來(lái)修改。這里涉及較多
的源碼流程,就不詳細(xì)闡述了,只直接給出結(jié)果。
(1)在squid啟動(dòng)時(shí),會(huì)將當(dāng)前限額記錄在Squid_MaxFD變量中;
第1章 服務(wù)器監(jiān)測(cè)
(2)當(dāng)FD不足時(shí),會(huì)調(diào)用內(nèi)核的socket來(lái)創(chuàng)建,這里socket需要檢查當(dāng)前的限額;
(3)不限額的話成功創(chuàng)建socket返回給squid;
(4) squid更新自己的另一個(gè)變量Biggest_FD,但在更新時(shí)會(huì)判斷這個(gè)最新的fd是否
小于Squid_MaxFD;
(5)如果大于Squid_MaxFD了,依然報(bào)錯(cuò)。
所以我們需要從兩方面入手,一方面修改已經(jīng)運(yùn)行的squid在調(diào)用socket時(shí)檢測(cè)的系
統(tǒng)rlimit;另一方面修改Squid_MaxFD變量。
關(guān)于系統(tǒng)的部分,跟蹤socket流程最后找到expand_files()函數(shù),其中關(guān)于FD限額的
判斷流程如下。
( 1) if (nr >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)
( 2) if (nr < fdt->max_fds)
( 3 ) if (nr >= sysctl_nr_open)
以上都通過(guò)了才進(jìn)入真正的expand_fdtable()。所以我們?cè)谶@個(gè)函數(shù)里修改rlim cur
和rlim max,stp腳本如下。
%{
#include <linux/sched.h>
#include <linux/resource.h>
%}
probe kernel.function("expand_files@fs/file.c") .call {. '
if ( execname () -= "squid" ) {
if ( rlim_cur() < 65535 ) {
printf("Change statusi %d\n", set rlim(65535》 ;
function rlim _cur:long ()
%{
struct signal_struct *ss = kread( &<current->signal》; ;
TH工S-> retvalue = kread (& (ss->rlim[RLIMIT NOFILE] .rlim cur》 ;