åºæ¬çãªããŒããžã§ãã¬ãŒã¿ãŒãæ§ç¯ããŠããŠããã¡ã€ã«èšè¿°åã®å¶éã«ã¶ã€ããå§ããŸããããªãœãŒã¹ã解æŸããæ¹æ³ã«é¢ããããã¥ã¡ã³ããèŠãããšããªãã®ã§ãééã£ãŠããã¥ã¡ã³ããæŽæ°ããå¿ èŠããããããªã¯ãšã¹ãããã¡ã€ã«èšè¿°åãã©ããã«ãªãŒã¯ããŠããŸãïŒãµããŒããªãïŒããŒãã¢ã©ã€ãã®ããã«ããã¡ã€ã«ããŸã£ããéãããŸãŸã«ãªãçç±ã«å°ãæ··ä¹±ããŠããŸãïŒ
requests.async
ã䜿çšããŠããå Žæã¯ïŒ
ãããããã¹ãŠã®ãªã¯ãšã¹ãã¯ããªãåçŽãªrequests.get / requests.postã§ãããç§ã¯ãŸã ããã«ããã€ãèŠãŠããŸã
$ lsof | grep localhost | wc -l
110
ãããã®4/5ãé€ããã¹ãŠããã©ãŒãããã§ã
Python 82117 daleharvey 123u IPv4 0xffffff800da304e0 0t0 TCP localhost:61488->localhost:http (CLOSE_WAIT)
æ£çŽãªãšãããç§ã¯ããã«å°ãå°æããŠããŸãã
ç§ãç æ°ã§éããããšãã§ããªãå Žåããã¡ãç æ°ã¯ããã確å®ã«åçŸããããã«å¥ã®ã·ã§ãããæ®ããŸã
ç§ã¯ãããç§ã«èµ·ãã£ãŠããã®ãèŠãŸãããã200以äžã®åææ¥ç¶ã§éåæã¢ãžã¥ãŒã«ã䜿çšããŠãããšãã ãã§ãã
ããã«ã¡ã¯ã
ãªã¯ãšã¹ããšgeventã§ã®ã¢ã³ããŒãããã䜿çšããŠããŸã£ããåãåé¡ãçºçããŸãããäžéšã®æ¥ç¶ã¯CLOSE_WAITã®ãŸãŸã§ãã
å€ågeventã®åé¡ãªã®ã§ã
ulimit-nã®åé¡ã§ããå¯èœæ§ããããŸãã ããé«ãå€ã§è©ŠããŠãã ããã
ãéããŠãããã¡ã€ã«ãå€ãããŸããã¯ããœã±ãããCLOSE_WAITã«ãšã©ãŸã£ãŠããããã«çºçãããã°ã®çµæã§ãã
ãããã£ãŠãulimitã¯ãåé¿çãäœæããã ãã§ã¯ä¿®æ£ãããŸããã
@tamielãããä¿®æ£ããã«ã¯ã©ãããã°ããã§ããïŒ
ã§ããã ãæ©ããã¹ããè¡ããä¿®æ£ãè©Šã¿ãŸãã
ç§ã¯ããã調ã¹ãŸããããhttplib.HTTPSConnectionã䜿çšãããã¹ãŠã®ã©ã€ãã©ãªã§åé¡ãããããã§ãã
ããã«äŸãæçš¿ããŸããïŒ
HTTPæ¥ç¶ã®ã¿ã®éåæããŒã«ã䜿çšããŠéåžžã«ãã䌌ããšã©ãŒãçºçããŸãã-ãŸã 調æ»äžã§ãããããŒã«ãµã€ãºãasync.mapã«æž¡ããšããšã©ãŒãããã«åçŸãããŸãã
ããã«å¯Ÿããä¿®æ£ã¯ãããŸããïŒ ããã«ããããªã¯ãšã¹ãã¯geventã§äœ¿çšã§ããªããªããŸãã
ããã¯ãã¹ãŠCLOSE_WAIT
ã§ãã ããããéããå¿
èŠããããŸãã ãªããŸã éããŠããã®ãããããŸããã
urllib3ã®åé¡ã§ããïŒ ããããèªåã§éããªããã°ãªããªãã®ã¯ãç§ãæããçŽ æŽãããã¢ã€ãã¢ã§ã¯ãããŸããã
ããã¯ãã£ãšäžè¬çãªåé¡ã§ãã ããã§äŒè©±ãç¶ããããšãã§ããŸãã
ãããããã説æããããã«ãhttplib2ãããªã¯ãšã¹ãã«ç§»è¡ããããšããŠããŸãããhttplib2ã§ã¯ãã®åé¡ã¯çºçããŠããŸããã ãããã£ãŠãããã¯ç¢ºãã«äžè¬çãªåé¡ã§ã¯ãããŸããã
äžè¬çã«èšã£ãŠãããã¯é¢ä¿è å šå¡ã«åœ±é¿ãäžããéåžžã«æ·±å»ãªåé¡ã ãšããããšã§ãã
ã§ã¯ãã©ãããã°ããã解決ã§ããŸããïŒ ç§ãã¡ã¯æ¬åœã«ãªã¯ãšã¹ããšç ãã䜿ãããã§ã
ãã®çããç¥ãããã§ãã
ãªãŒã¯ã¯ãä¿çäžã®å¿çãæ¶è²»ãããåã«æ°ããèŠæ±ãçæãããå éšãªãã€ã¬ã¯ãåŠçãåå ã§ãããšæãããŸãã acdha @ 730c0e2e2bef77968a86962f9d5f2bebba4d19ecã®ãã¹ãã§ã¯ãç¶è¡ããåã«åå¿çã匷å¶çã«æ¶è²»ããã ãã§ãæºè¶³ã®ãããã®ã§ã¯ãããŸãããå¹æçãªä¿®æ£ãè¡ãããŸãã
ããã«ã¯2ã€ã®å Žæã§ã®å€æŽãå¿ èŠã§ãããã€ã³ã¿ãŒãã§ã€ã¹ãå°ããªãã¡ã¯ã¿ãªã³ã°ããããšæããŸãããçŸåšç¶è¡ããæéã¯ãããŸããã
asyncã䜿çšããŠãããšãã«åãåé¡ãçºçããŸãã-ãªã¯ãšã¹ãããã£ã³ã¯ããã¬ã¹ãã³ã¹ãåé€ããããgc.collectãåŒã³åºãããšã§åé¿çãèŠã€ããŸãã
ç§ã¯ä»æ¥ã5ã€ã®æ¥ç¶ããèš±å¯ããªãã©ã€ã»ã³ã¹ãµãŒããŒã«æ¥ç¶ããŠãããšãã«ããã«ééãããšæããŸãã
asyncã䜿çšãããšã60ç§éäžæåæ¢ããåã«ã4ã€ã®ãã®ããååŸã§ããŸããã§ããã
éåžžã®GETãæ¶è²»ãšãšãã«äœ¿çšãããšã40ç§ä»¥å ã«çŽ150åã®ããŒã¿ãé£ç¶ããŠãã§ããã§ããŸããã
ãã®åé¡ãèŠãŠä»¥æ¥ããŸã å¿æ¥ä¿®çãããŠããŸããã
ipythonã®äœ¿çšäžã«ãã®ãšã©ãŒãçºçãããã®ã¡ãã»ãŒãžã衚瀺ãããŸããã ããã¯ãäžåºŠã«1ã€ãã€ãªã¯ãšã¹ããè¡ãã ãã§ãããasyncã䜿çšãããšäŒŒããããªãã®ãåŸããããšæããŸãã
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/IPython/core/ultratb.py", line 756, in structured_traceback
File "/Library/Python/2.7/site-packages/IPython/core/ultratb.py", line 242, in _fixed_getinnerframes
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 1035, in getinnerframes
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 995, in getframeinfo
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 456, in getsourcefile
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 485, in getmodule
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 469, in getabsfile
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 347, in abspath
OSError: [Errno 24] Too many open files
Unfortunately, your original traceback can not be constructed.
å¥åŠãªããšã«ãéåžžã®Pythonã€ã³ã¿ãŒããªã¿ãŒã ãã䜿çšãããšããæ倧åè©Šè¡ãšã©ãŒããçºçãããšæããŸãããããã¯ãã¹ãŠåããã¡ã€ã³ã§ãªã¯ãšã¹ããå®è¡ããéã®å¥ã®åé¡ã ãšæããŸããã確ãã§ã¯ãããŸããã
allow_redirectsãTrueã§ãã£ãæåã®ãããžã§ã¯ãã§ããã«ééããŸããã ããã¯ãprefetch = Trueã§ã解æŸãããªãå¿çãªããžã§ã¯ãããªãŒã¯ãããªãã€ã¬ã¯ããã§ãŒã³ãåå ã§ãããšæãããŸãã ããã¯ç§ã®æåã®ãã¹ãã§ãããä¿®æ£ããŸããïŒ
[i.raw.release_conn() for i in resp.history]
resp.raw.release_conn()
ããŒã..
@acdhaèšå®ïŒ
requests.defaults.defaults['allow_redirects'] = False
ãªã¯ãšã¹ããè¡ãåã§ãåããšã©ãŒãçºçããŸãããããã¯ç§ã®å®è£ ã®ãªãã·ã§ã³ã§ã¯ãªããšæããŸããç§ãè¡ããã¹ãŠã®ãªã¯ãšã¹ãã«ã¯ãªãã€ã¬ã¯ããå¿ èŠã«ãªãããã§ã= /
@dalanmillerå¿çãã©ã®ããã«åŠçããŠããŸããïŒ ä»¥åã¯å¿çããã¯ã§async.map
ã䜿çšããŠããŸãããã async.imap
åçŽãªã«ãŒãã䜿çšãããšãããå®å®ããŠããããã«èŠããŸãã
for resp in requests.async.imap(reqs, size=8):
try:
print resp.status_code, resp.url
finally:
[i.raw.release_conn() for i in resp.history]
resp.raw.release_conn()
@acdha
ç§ã¯URLãªã¹ããä»ããŠforã«ãŒãã䜿çšããèšå®ãªã©ã䜿çšããŠããããã«å¯ŸããŠrequest.getãå®è¡ããŠããŸããã
for u in urls:
response_list.append(requests.get(u))
ç§ã¯ããªãã®ããŒã¹ãã䜿ã£ãŠã¿ãŸããããæ®ãã®ãURLã§æ倧åè©Šè¡ãšã©ãŒãè¶ ããŸãããã衚瀺ããããŸã§ã900ã®é·ãã®ãªã¹ãã§çŽ50ã®ãªã¯ãšã¹ãã«å¯Ÿå¿ããŠããŸãã åããã¡ã€ã³ãç¹°ãè¿ããããããå Žåã§ããããã¯ããªãæšæºçãªãšã©ãŒã§ãã
ãããç§ã¯URLã®èšå€§ãªãªã¹ã35kãã¯ããŒã«ããŠããŠããªã¯ãšã¹ãã®_ããã€ã_ã§ãããšåããšã©ãŒãçºçããŸããã
次ã®ããã«ã10åã®ãã£ã³ã¯ã§URLãååŸããŠããŸãã
responses = requests.async.map([requests.async.get(u, params=self.params()) for u in chunk]) # chunk is a list of 10
20kã®ç¯å²ã®ã©ããã§ããšã©ãŒ24ãçºçãå§ããŸããããã®åŸã30kãŸã§ã¯åé¡ãããŸããã§ããã
ãããçµã蟌ãããã«èå³ãããæ å ±ã¯ä»ã«ãããŸããïŒ
requests.async
ã¯ãªããªããŸããã grequestsãžã®ç§»è¡ãæ€èšããããšããå§ãããŸãã
äºè§£ãããããšãã ããã¥ã¡ã³ãã§ããã«ã€ããŠèšåãããšããã§ãããã
ãã«ãªã¯ãšã¹ããšããã¥ã¡ã³ãã®äœæã«é¢ããŠã¯ãäžçš®ã®åå¿è ã§ãããç§ã¯ãããçªãåºããŠéä¿¡ããŸããã ã³ã¡ã³ããŸãã¯æ¹å€ããŠãã ãã:)
ããããŸãããããã¯ãéåæã䜿çšããªããŠãã6Kãªã¯ãšã¹ãã®åŸã«requests.getã ãã§çºçããŸãã
ç§ã¯ãããçã£ãã
ç§ã®å Žåãæ£ç¢ºã«1,000åã®ãã¡ã€ã«ãããŠã³ããŒãããåŸã«ãéããŠãããã¡ã€ã«ãå€ãããŸãããšãããšã©ãŒãçºçããŸããã ç§ã®è§£æ±ºçã¯ãkeep-aliveããããã£ãç¡å¹ã«ããŠããªã¯ãšã¹ãããã£ã³ã¯ã§ååŸããããšã§ããïŒ @acdhaã¯ãã³ããããããšãïŒã lsof -p PID | wc -l
ã¯ãå®è¡äžã®æ¥ç¶æ°ãå¢å ããŠããªãããšã瀺ããŠããŸãã
rsess = requests.session()
rsess.config['keep-alive'] = False
rs = [grequests.get(l, session=rsess) for l in links]
for s in chunks(rs,100):
responses = grequests.map(s, size=concurrency)
for r in responses:
try:
print(r.status_code, r.url)
finally:
r.raw.release_conn()
[1]ãã£ã³ã¯ïŒ http ïŒ
urllib3ã®ä¿®æ£ã延æããªããçµäºããŸãã
@kennethreitz urllib3ã®çºè¡çªå·ã¯äœã§ããïŒ
ãããåé¡ã®ããã§ãhttp://bugs.python.org/issue16298
@silvexisã¯urllib3ã®ãã°ã«é¢é£ããŠããå¯èœæ§ãéåžžã«é«ãã®ã§ã誰ãã@ piotr-dobrogostïŒPãšçããŠããããããã®ã«ãšæããŸãã
ä»ã®èª°ãããŸã ãã®åé¡ã«çŽé¢ããŠããŸããïŒ
ç§ã¯ããã«ã€ããŠã®å ±åãèããããšããããŸããã ããªãã§ããïŒ
ããã¯ããã¬ãŒã ã¯ãŒã¯ã§ã¯ãªããããã¯ã¹æ§æã®åé¡ã§ãã OSã®ã«ãŒãã«æ§æã確èªããŠãã ããã BSDã§ã¯kern.maxfiles
ãšåŒã°ããŸãã Linuxã·ã¹ãã ã«ã¯ulimit
ã«é¢ããã¹ã¬ããããããŸãïŒ http ïŒ
ã圹ã«ç«ãŠã°å¹žãã§ããWindowsã§ãã®ãã©ã¡ãŒã¿ãŒãå€æŽããæ¹æ³ãããããŸããã
å€ãããŒãžã§ã³ã®ãªã¯ãšã¹ãããŸã å®è¡ããŠãããšããèŠåããããŸããããããåŠçããããã«æ¬¡ã®æãããã³ãŒããçšæãããŠããŸãã
if self._current_response is not None:
# Requests doesn't have a clean API to actually close the
# socket properly. Dig through multiple levels of private APIs
# to close the socket ourselves. Icky.
self._current_response.raw.release_conn()
if self._current_response.raw._fp.fp is not None:
sock = self._current_response.raw._fp.fp._sock
try:
logger.debug('Forcibly closing socket')
sock.shutdown(socket.SHUT_RDWR)
sock.close()
except socket.error:
pass
ïŒself._current_responseã¯ãªã¯ãšã¹ãã®ã¬ã¹ãã³ã¹ãªããžã§ã¯ãã ãšæããŸãïŒ
ããŒããã¯ããŒãžã³ã°ã®ãã§ãŒã³ã¯ã©ãã§å£ããŠããŸããïŒ æã
ã¯æã£ãŠããResponse.close()
ã¡ãœããåŒã³åºãrelease_conn()
å¿
èŠãšãããã®ããã§çºçãã release_conn()
ä»äºã«ããã®ããã«ïŒ
@Lukasaç§ãè°è«ã®äžéšã ã£ãurllib3ã§ééããªãä¿®æ£ãããŸããã ç§ã®èŠç©ããã§ã¯ä¿å®çãªåŸåããããŸããã1.1.xã§ã¯ãªããŠã1.2.xãèŠæ±ããŠããã®ã§ãããã«ãããšèšããŸãã
ãããç§ã¯ãããä¿®æ£ããããšæããŸããã 1.2.3ã«äœãã衚瀺ãããªãéããããã¯ä¿®æ£ãããŠãããšæããŸãã
2.0.2ã§CLOSE_WAITãªãŒã¯ãçºçããŠããŸããããããã¯ã«ãªã°ã¬ãã·ã§ã³ããªãããšã確èªããããã®åäœãã¹ãã¯ãããŸããïŒ
ããããããŸããã AFAIKurllib3ãããã§ã¯ãããŸããã ãªãŒã¯ãç°¡åã«åçŸã§ããŸããïŒ
æææ¥ãã瀟å ã¢ããªã§ãªã¯ãšã¹ãã䜿çšããŠãããä»æ¥ã¯1024åã®maxfilesã«å°éããŠããŸãã
åèµ·åã®2æéåŸãlsofã®æ瀺ã«åŸã£ãŠ40åã®CLOSE_WAITããããŸãã
ã§ããããéçºç°å¢ã§åçŸã§ãããšæããŸãã é£çµ¡ãåãåããŸã
@tardypããã©ã®ããã«ãªã¯ãšã¹ããã€ã³ã¹ããŒã«ããŸãããïŒ ãã¹ãŠã®OSããã±ãŒãžã¡ã³ãããurllib3ãåãé€ããŠãããšæããŸãã ããããææ°ã®ç¶æ ã«ä¿ãããŠããããå€ãããŒãžã§ã³ã䜿çšããŠããå Žåã¯ã代ããã«ãããåå ã§ããå¯èœæ§ããããŸãã pipã䜿çšããŠããå Žåã¯ããã®åé¡ã«ãã£ã¹ã«ãã·ã§ã³ãè¿œå ãã代ããã«ãæ°ããåé¡ãéããŠããã远跡ããŠãã ããã
pipã䜿çšããŠã€ã³ã¹ããŒã«ããŸããããpython 2.6ã䜿çšããŠããŸããpython2.7ã§ä¿®æ£ãèŠãããŸããã
ãã®ãã°ã å€ãããŒãžã§ã³ã®ã¢ã³ããŒãããã¯ãããŸããïŒ
ããšãŒã«
17:33æéã2013幎11æ29æ¥ã«ã¯ãã€ã¢ã³Cordascoã®[email protected] ïŒ
@tardyp https://github.com/tardypãŸããã©ã®ããã«ãªã¯ãšã¹ããã€ã³ã¹ããŒã«ããŸãããïŒ ç§
ãã¹ãŠã®OSããã±ãŒãžã¡ã³ãããurllib3ãåé€ãããšæããŸãã ããã§ãªãå Žå
ãããææ°ã®ç¶æ ã«ä¿ã¡ãå€ãããŒãžã§ã³ã䜿çšããŠããå Žåãããã¯
代ããã«åå ã pipã䜿çšããŠããå Žåã¯ãæ°ããåé¡ãéããŠãã ããã
ããã«ãã£ã¹ã«ãã·ã§ã³ãè¿œå ãã代ããã«ãããã远跡ããŸããâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGi tHubhttpsïŒ//github.com/kennethreitz/requests/issues/239#issuecomment-29526302ã§è¡šç€ºããŠãã ãã
ã
@tardypã¯ãäœæããŠãããªã¯ãšã¹ãã«ãªãã€ã¬ã¯ãããããã©ãããgeventã䜿çšããŠãããã©ãããªã©ãã§ããã ã詳现ã«æ°ããåé¡ãéããŠãã ããã ãŸãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«é¢ãã詳现ãšãããåçŸããæ¹æ³ã®äŸã¯çŽ æŽãããã§ãããã
åèãŸã§ã«https://github.com/shazow/urllib3/issues/291ã¯ãã°ã®ããã«å ã«æ»ãããŸããã
ãããåéããå¿
èŠããããŸããïŒ
ç§ã¯åãåé¡ãæ±ããŠããŸãïŒ
@polvoazulããã2011幎ã«æåã«å ±åãããã®ãšåãåé¡ã§ãããšããæ¹æ³ã¯ãªãã®ã§ãåéããããšã¯æ£ãããšã¯æããŸããã ãã ããçŸåšã®ãªãªãŒã¹ã®ãªã¯ãšã¹ãïŒ2.4.3ïŒãå®è¡ããŠããŠãåé¡ãåçŸã§ããå Žåã¯ãæ°ããåé¡ãéãã®ãæ£ããã§ãããã
@Lukasaç§ã¯ããªãã®å©ããå¿ èŠã§ããç§ã¯ã€ãã³ãã¬ãã+ãªã¯ãšã¹ãã䜿çšããŸããããã¯åžžã«ãããã³ã«ãèå¥ã§ããªãéåžžã«å€ãã®éŽäžãäœæããŸããç§ã®ãªã¯ãšã¹ãã¯2.4.3ã§ãããã€ãã³ãã¬ãã+ãªã¯ãšã¹ãã¯ãã®åé¡ãåŒãèµ·ãããŸããïŒ
@mygodaç³ãèš³ãããŸããããç¥ãããšã¯äžå¯èœã§ãã äžåºŠã«æªåŠçã«ãªãå¯èœæ§ã®ãããªã¯ãšã¹ãã®æ°ãå¶éããŠããªããã°ãããã¯ç¢ºãã«å¯èœã§ãããããã¯ãªã¯ãšã¹ãã®ç¯å²å€ã®ã¢ãŒããã¯ãã£äžã®åé¡ã§ãã
@Lukasaã¯ããªãã«æè¬ããŸããç§ã¯ç§ã®åé¡ã¯ããšäŒŒãŠãããšæãããã®ãç§ã®ãããžã§ã¯ããããpyvmomi ã ãã®æ¥ç¶ã¯é·ãæ¥ç¶ã§ãã ãªããããªã«å€ãã®äººããããã³ã«ãœãã¯ã¹ãèå¥ã§ããªãã®ãç§ã¯ãã€ãæ··ä¹±ããŠããŸã
çŸåšåãåé¡ãããã120ã¹ã¬ãããå®è¡ãããšã100000以äžã®ãã¡ã€ã«ãéãããŸãããçŸåšè§£æ±ºçã¯ãããŸããïŒ
@mygodaããªãã¯çŽ æŽããã
@ 1a1a11a _What_ãã¡ã€ã«ãéããŠããŸããïŒ ããã¯ããã®åé¡ãç解ããããã®æçšãªæåã®ã¹ãããã«ãªããŸãã
@ 1a1a11aã©ã®ããŒãžã§ã³ã®ãªã¯ãšã¹ãã䜿çšããŠããŸããïŒ Pythonã®ã©ã®ããŒãžã§ã³ã§ããïŒ ã©ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ããïŒ äœãæ å ±ãå ¥æã§ããŸããïŒ
ç§ã¯ãªã¯ãšã¹ã2.9.1ãpython 3.4ãubuntu 14.04ã䜿çšããŠããŸããåºæ¬çã«ããããã·ã䜿çšããŠ30ã®ã¹ã¬ããã䜿çšããŠã¯ããŒã©ãŒãäœæããäžéšã®Webãµã€ããã¯ããŒã«ããŠããŸãã çŸåšãããã»ã¹ããšã®ãã¡ã€ã«å¶éã655350ã«èª¿æŽããŸãããããããªããšããšã©ãŒãå ±åãããŸãã
ãæ°ããæ¥ç¶ã®ç¢ºç«ã«å€±æããŸããïŒ[Errno24]éããŠãããã¡ã€ã«ãå€ãããŸãããšãããšã©ãŒãrequests.packages.urllib3.connection.VerifiedHTTPSConnectionããåŒãç¶ã衚瀺ãããŸããPython3.4ãrequests 2.11.1ãrequests-futuresã䜿çšããŠããŸãã 0.9.7ããªã¯ãšã¹ãã«æè¬ããŸã-futuresã¯å¥ã®ã©ã€ãã©ãªã§ããããšã©ãŒã¯ãªã¯ãšã¹ãããçºçããŠããããã§ããSSLãä»ããŠ180kã®éåæãªã¯ãšã¹ããäœæããããšããŠããŸãããããã®ãªã¯ãšã¹ãã1000ã®ã»ã°ã¡ã³ãã«åå²ããã®ã§ãå°æ¥ã®ãã¹ãŠã®ãªããžã§ã¯ãã解決ãããåŸã§ã®ã¿ã次ã®1000ã«ç§»åããŸããUbuntu16.04.2ãå®è¡ããŠãããããã©ã«ãã®ãªãŒãã³ãã¡ã€ã«å¶éã¯1024ã§ãããã®ãšã©ãŒã®æ ¹æ¬çãªçç±ãç解ããŠãããšããã§ãããããªã¯ãšã¹ãã©ã€ãã©ãªã¯äœæããŸããåã ã®ãªã¯ãšã¹ãããšã«éããŠãããã¡ã€ã«ïŒãããããªãããªãã§ããïŒããã¯SSL蚌ææžãã¡ã€ã«ã§ããïŒãããŠãªã¯ãšã¹ãã©ã€ãã©ãªã¯ãå°æ¥ã®ãªããžã§ã¯ãã解決ããããšãã«ãããã®éããŠãããã¡ã€ã«ãèªåçã«éããŸããïŒ
ãªã¯ãšã¹ãã¯å€ãã®ãã¡ã€ã«ãéããŸãã ãããã®ãã¡ã€ã«ã®äžéšã¯èšŒææžçšã«éãããŸãããèŠæ±ã§ã¯ãªãOpenSSLã«ãã£ãŠéãããããããããã¯ç¶æãããŸããã ããã«ããªã¯ãšã¹ãã¯ãå¿
èŠã«å¿ããŠã .netrc
ãã¡ã€ã«ãhostsãã¡ã€ã«ãããã³ãã®ä»ã®å€ãã®ãã¡ã€ã«ãéããŸãã
strace
ãªã©ã®ããŒã«ã䜿çšããŠãéããŠãããã¡ã€ã«ãç¹å®ããããšããå§ãããŸãã ãã¡ã€ã«èšè¿°åãå²ãåœãŠãããåå ãšãªãã·ã¹ãã ã³ãŒã«ã®å³å¯ãªãªã¹ãããããããããããåççã«è¿
éã«åæã§ããã¯ãã§ãã ãŸããåé¡ããããã©ãããããããŸãã ãã ããã¯ããHTTPSãä»ããŠã¢ã¯ãã£ãã«1000ã®æ¥ç¶ã確ç«ããŠããå ŽåãããŒã¯è² è·æã«1000ãè¶
ããFDãç°¡åã«äœ¿çšã§ãããšæããŸãã
ç§ããã®åé¡ã«èŠåŽããOS Xã§opensnoop
ã䜿çšãããšã誰ããåãåé¡ã«ééããå Žåã«äœãèµ·ãã£ãŠããã®ãã確èªããã®ã«éåžžã«å¹æçã§ããããšãããããŸããã
requests.post(url, data=data)
ãHTTP
ïŒHTTPSã§ã¯ãªãïŒãµãŒããŒã«ç¹°ãè¿ãåŒã³åºããšãã«ãããã®ãšã©ãŒãé »ç¹ã«çºçããŸãã Ubuntu 16.04.3ãPython 3.5.2ã§å®è¡ãããšã2.9.1ãèŠæ±ãããŸã
data
ãšã¯äœã§ããïŒ
æ°çŸãããã€ãã®ããã¹ã
ãã¡ã€ã«ãªããžã§ã¯ãã§ã¯ãããŸãããïŒ
ããããã¡ã¢ãªå ã§å€§ããªã¯ãšãªãäœæããŸãã
ãã®ã³ãŒããè€æ°ã®ã¹ã¬ããã§å®è¡ããŠããŸããïŒ
ããããã·ã³ã°ã«ã¹ã¬ãããããŒã«ã«ãã¹ããžã®æçš¿
ãã®å Žåãå€ãã®FDããªãŒã¯ããããšã¯ã»ãšãã©äžå¯èœã®ããã§ããåãTCPæ¥ç¶ãç¹°ãè¿ã䜿çšããããç©æ¥µçã«éããå¿ èŠããããŸãã ãµãŒããŒãäœãããŠããã®ãã確èªãããã§ããïŒ
ç§ã¯ãã®åé¡ãæ±ããŠããŸãã Python 2.7ããªã¯ãšã¹ã2.18.4ãurllib31.22ã
ãã«ãã¹ã¬ããã³ãŒãã®å®è¡ïŒãã«ãããã»ã¹ã§ã¯ãªãïŒã äžåºŠã«æ倧6ã€ã®URLã«æ¥ç¶ããããããã®æ°ããã»ãã·ã§ã³ãæåã§äœæããŠéããŸãã
Python 3.5
ã requests==2.18.4
ã§ãåãåé¡ãçºçããŠããŸã
@mcobzarencoã¯ãå¿çã®åºã«ãªãæ¥ç¶ãïŒæé»çã«ïŒéããŠãããšç¢ºä¿¡ããŠããŸããïŒ åã«å¿çãè¿ãã ãã§ã¯ãæ¥ç¶ã¯éããããŸããã response.contentãèªã¿åããšããããŒã¿ã¯å®éã«èªã¿åããããã®åŸããœã±ããã¯CLOSE_WAITã«çãŸããŸããã
æãåèã«ãªãã³ã¡ã³ã
ãéããŠãããã¡ã€ã«ãå€ãããŸããã¯ããœã±ãããCLOSE_WAITã«ãšã©ãŸã£ãŠããããã«çºçãããã°ã®çµæã§ãã
ãããã£ãŠãulimitã¯ãåé¿çãäœæããã ãã§ã¯ä¿®æ£ãããŸããã