2010-01-22 6 views
5

मैं एक साइट एक बार में कई यूआरएल से कनेक्ट होता है पर काम कर रहा हूँ और कोई फर्क नहीं पड़ता कि मैं क्या प्रयास करें (हम प्रति मिनट ~ 600 को पाने के लिए उम्मीद कर रहे हैं), वहाँ हमेशा के हजारों रहे हैं TIME_WAIT अभी भी खुला है। मैं समझता हूं कि ये टीसीपी कनेक्शन के लिए महत्वपूर्ण हैं, लेकिन वे सभी उपलब्ध बंदरगाहों का उपयोग कर रहे हैं। PHP में SO_REUSEPORT नहीं है, और SO_REUSEADDR दूरस्थ कनेक्शन के साथ काम नहीं करता है। यहाँ कोड की शुरुआत है:हजारों, बंद आदि

$s = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
socket_set_option($s, SOL_SOCKET, SO_LINGER,array('l_linger'=>0, 'l_onoff'=>0)); //I have tried l_onoff=1 
socket_set_option($s, SOL_SOCKET, SO_RCVTIMEO,array('sec'=>0,'usec'=>500000)); 
socket_set_option($s, SOL_SOCKET, SO_SNDTIMEO,array('sec'=>0,'usec'=>500000)); 
socket_set_option($s, SOL_SOCKET, SO_KEEPALIVE,0); 
socket_set_option($s, SOL_SOCKET, SO_REUSEADDR,1); 
socket_set_nonblock($s); 
socket_bind($s,$ip,0); 
socket_connect($s,$host,$port); 

$ s एक सरणी में चला जाता है सभी लंबित लिखते हैं, एक लिखने socket_shutdown हम फोन के बाद ($ s 1) शामिल हैं; सॉकेट पर लिखना बंद करने के लिए। फिर एक पढ़ने के बाद हम:

socket_shutdown($s,2); socket_close($s); 

सभी पढ़ने और लिखने थोड़ी देर के पाश में किया जाता है, पाश 12 समवर्ती कनेक्शन की एक अधिकतम है, कि अगर हिट नहीं है, तो उस पर ले जाता है और दूसरा URL जोड़ने के लिए आगे बढ़ता सरणी के लिए। हर पाश कॉल 0.

का समय समाप्त साथ socket_select किसी को भी किसी भी सुझाव हैं? मैं गति को बढ़ाने के साथ-साथ netstat में दिखाई देने वाली TIME_WAIT को कम करना चाहता हूं।

धन्यवाद, जेम्स हार्टिग

उत्तर

3

आप अपने अनुरोध के साथ HTTP शीर्षलेख Connection: close भेज सकते हैं जो आपको अनुरोध के बाद सर्वर को एक टीसीपी एफआईएन भेजने का कारण बनता है। क्योंकि दूसरी तरफ पहला एफआईएन भेजता है, यह दूसरी तरफ होगा जो TIME_WAIT में प्रतीक्षा करने के लिए मिलता है, न कि आप।

1

आप लिनक्स पर TIME_WAIT को कम करना चाहते हैं, तो आप एक proc सेटिंग को संशोधित कर सकते हैं:

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout 

इसमें 30 सेकंड का समय समाप्त बदल जाएगा। ध्यान दें कि TIME_WAIT मानक टीसीपी/आईपी व्यवहार का एक हिस्सा है - जब तक कि आप संसाधनों के लिए वास्तव में भूखे नहीं हैं, मैं इस के साथ ज्यादा नहीं मिलूंगा।

संबंधित मुद्दे