๊ธฐ๋ณธ๋ก๋ ์์ฑ๊ธฐ๋ฅผ ๊ตฌ์ถ ์ค์ด๊ณ ํ์ผ ์ค๋ช ์ ์ ํ์ ๋๋ฌํ๊ธฐ ์์ํ์ต๋๋ค. ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ๋ ๋ฌธ์๋ฅผ ๋ณด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋ชปํ๊ณ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํด์ผํ๊ฑฐ๋ ์์ฒญ์ด ์ด๋๊ฐ์ ํ์ผ ์ค๋ช ์๋ฅผ ์ ์ถํ๊ณ ์์ต๋๋ค (์ง์ ์์). Keepalive์ ๊ฒฝ์ฐ ํ์ผ์ด ์ ํ ์ด๋ ค์๋ ์ด์ ์ ๋ํด ์ฝ๊ฐ ํผ๋์ค๋ฌ์ํฉ๋๋ค.)
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)
์์งํ ๋งํด์ ์กฐ๊ธ ๋นํฉ ์ค๋ฝ์ต๋๋ค.
Hah ill ๋ค์ ํ ๋ฒ ์ฐ์ด ์์ ์ ์ผ๋ก ์ฌํ ํ ์ ์๋ค๋ฉด
๋๋ ์ด๊ฒ์ด ๋์๊ฒ ์ผ์ด๋๋ ๊ฒ์ ๋ณด์์ง๋ง 200 ๊ฐ ์ด์์ ๋์ ์ฐ๊ฒฐ์ด์๋ ๋น๋๊ธฐ ๋ชจ๋์ ์ฌ์ฉํ ๋๋ง ๊ฐ๋ฅํฉ๋๋ค.
์๋
ํ์ธ์,
gevent์ ํจ๊ป ์์ฒญ ๋ฐ ์์ญ์ด ํจ์น๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ผ๋ถ ์ฐ๊ฒฐ์ CLOSE_WAIT์ ์์ต๋๋ค.
gevent์ ๋ฌธ์ ๊ฐ์์ ์ ์์ต๋๋ค.
ulimit -n ๋ฌธ์ ์ผ ์ ์์ต๋๋ค. ๋ ๋์ ๊ฐ์ผ๋ก ์๋ํ์ญ์์ค.
"์ด๋ฆฐ ํ์ผ์ด ๋๋ฌด ๋ง์"์ ์์ผ์ด CLOSE_WAIT์ ๋จธ๋ฌผ๋ฌ์ ๋ฐ์ํ๋ ๋ฒ๊ทธ์ ๊ฒฐ๊ณผ์
๋๋ค.
๊ทธ๋์ ulimit๋ ํด๊ฒฐํ์ง ์์ต๋๋ค.
@tamiel ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํฉ๋๊น?
์ต๋ํ ๋นจ๋ฆฌ ๋ ๋ง์ ํ ์คํธ๋ฅผ ์ํํ๊ณ ์์ ํ๋ ค๊ณ ํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์กฐ์ฌํ๊ณ httplib.HTTPSConnection์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ์ ์๋ฅผ ๊ฒ์ํ์ต๋๋ค.
HTTP ์ฐ๊ฒฐ ๋ง์๋ ๋น๋๊ธฐ ํ์ ์ฌ์ฉํ์ฌ ๋งค์ฐ ์ ์ฌํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์์ง ์กฐ์ฌ ์ค์ด์ง๋ง ํ ํฌ๊ธฐ๋ฅผ async.map์ ์ ๋ฌํ๋ฉด ์ค๋ฅ๊ฐ ๋น ๋ฅด๊ฒ ์ฌํ๋ฉ๋๋ค.
์ด๊ฒ์ ๋ํ ์์ ์ฌํญ์ด ์์ต๋๊น? ์ด๋ก ์ธํด gevent์์ ์์ฒญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
CLOSE_WAIT
์ ๊ดํ ๋ชจ๋ ๊ฒ์
๋๋ค. ๋ซ์์ผํฉ๋๋ค. ๊ทธ๋๋ ์ ์ฌ์ ํ ์ด๋ ค ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
urllib3 ๋ฌธ์ ์ ๋๊น? ์ด๊ฒ๋ค์ ์ค์ค๋ก ๋ซ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋๋ค.
๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๋๋ค. ์ฌ๊ธฐ์ ๋ํ๋ฅผ ๊ณ์ํ ์ ์์ต๋๋ค.
๋น์ ์๊ฒ ๊ด์ ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ httplib2์์ ์์ฒญ์ผ๋ก ์ด๋ํ๋ ค๊ณ ์๋ํ๊ณ ์์ผ๋ฉฐ httplib2์์๋์ด ๋ฌธ์ ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ์๋๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ด๋ จ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๋งค์ฐ ์ฌ๊ฐํ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ด๋ป๊ฒ ํด๊ฒฐํฉ๋๊น? ์ฐ๋ฆฌ๋ ์ ๋ง๋ก ์์ฒญ + ์๋ฉด์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
์ด์ ๋ํ ๋ต์ ์๊ณ ์ถ์ต๋๋ค.
๋์๋ ๋ด๋ถ ๋ฆฌ๋๋ ์ ์ฒ๋ฆฌ๋ก ์ธํ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๋ณด๋ฅ์ค์ธ ์๋ต์ด ์ฌ์ฉ๋๊ธฐ ์ ์ ์ ์์ฒญ์ด ์์ฑ๋ฉ๋๋ค. ํ ์คํธ์์ acdha @ 730c0e2e2bef77968a86962f9d5f2bebba4d19ec ๋ ๊ณ์ํ๊ธฐ ์ ์ ๊ฐ ์๋ต์ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํจ์ผ๋ก์จ ๋ง์กฑ์ค๋ฝ์ง ์์ง๋ง ํจ๊ณผ์ ์ธ ์์
์ด๊ฒ์ ์ธํฐํ์ด์ค๋ฅผ ์ฝ๊ฐ ๋ฆฌํฉํ ๋งํ๊ณ ์ถ๊ฒ ๋ง๋๋ ๋ ๊ณณ์์ ๋ณ๊ฒฝ์ด ํ์ํ์ง๋ง ํ์ฌ ๊ณ์ํ ์๊ฐ์ด ์์ต๋๋ค.
async๋ฅผ ์ฌ์ฉํ ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฒญํฌ ์์ฒญ ๋ฐ ์๋ต ์ญ์ /gc.collect ํธ์ถ๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค.
์ ๋ ์ค๋ 5 ๊ฐ์ ์ฐ๊ฒฐ ๋ง ํ์ฉํ๋ ๋ผ์ด์ ์ค ์๋ฒ์ ์ฐ๊ฒฐํ๋ ์ค์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋น๋๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด 60 ์ด ๋์ ์ผ์ ์ค์ง๋๊ธฐ ์ ์ 4 ๊ฐ์ง ํญ๋ชฉ ๋ง ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์๋น์ ํจ๊ป ์ผ๋ฐ GET์ ์ฌ์ฉํ๋ฉด 40 ์ด ์ด๋ด์ ์ฝ 150 ๊ฐ์ ํญ๋ชฉ์ ์ฐ์์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ณธ ์ดํ๋ก ์์ง ๋ด ์ค์๋ฅผํ์ง ์์์ต๋๋ค.
ipython์ ์ฌ์ฉํ๋ ๋์์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์ด ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค. ์ด๊ฒ์ ๊ฐ ์์ฒญ์ ํ ๋ฒ์ ํ๋์ฉ ๋ง๋๋ ๊ฒ์ด์ง๋ง ๋น๋๊ธฐ๋ฅผ ์ฌ์ฉํ ๋ ๋น์ทํ ๊ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
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 ์ธํฐํ๋ฆฌํฐ ๋ง ์ฌ์ฉํ ๋ "Max Retries Error"๊ฐ ๋ฐ์ํ๋ค๊ณ ์๊ฐํ์ง๋ง ๋์ผํ ๋๋ฉ์ธ์์ ์์ฒญ์ ์ํํ๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง๋ง ํ์คํ์ง ์์ต๋๋ค.
๋๋ 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
์ด์์ ๊ฐ๋จํ ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์์ ์ ์ด๋๋ ๊ฒ์ผ๋ก _appears_ :
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 ๊ฐ์ ์์ฒญ์ ๋ํด ์๋ํฉ๋๋ค. ๊ทธ๋๋ ๋์ผํ ๋๋ฉ์ธ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ณต๊ฒฉํ๋ ๊ฒ์ ๊ฝค ํ์ค์ ์ธ ์ค๋ฅ์ ๋๋ค.
์ด๋ด, ๋๋ 35k์ ๊ฑฐ๋ํ URL ๋ชฉ๋ก์ ํฌ๋กค๋งํ๊ณ ์์๊ณ _some_์ ์์ฒญ์์ ์ด์ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด 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๋ก ์ด๋ํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
์ข์, ๊ณ ๋ง์. ๋ฌธ์์์ ์ด๊ฒ์ ์ธ๊ธํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค.
Pull Requests์ ๋ฌธ์ ์์ฑ์ ๊ดํด์๋ ์ผ์ข ์ ๋ฉ์ฒญํ ์ผ์ด์ง๋ง ๋๋ ๊ทธ๊ฒ์ ์ฐ๋ฌ ๋ณด๋์ต๋๋ค. ์๊ฒฌ์ด๋ ๋นํ ๋ถํ๋๋ฆฝ๋๋ค :)
์ข์, ์ด๊ฒ์ 6K ์์ฒญ ํ requests.get๋ง์ผ๋ก ๋น๋๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋ฐ์ํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์์ฌํ๋ค.
๋์๊ฒ ์ ํํ 1k ํ์ผ์ ๋ค์ด๋ก๋ ํ ํ '๋๋ฌด ๋ง์ ํ์ผ ์ด๊ธฐ'์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ด ํด๊ฒฐ์ฑ
์ 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://stackoverflow.com/a/312464
urllib3 ์์ ์ ์ฐ๊ธฐํ๋ ๋์ ๋ซ๊ธฐ.
@kennethreitz urllib3์ ๋ฐํ ๋ฒํธ๋ ๋ฌด์์ ๋๊น?
์ด๊ฒ์ด ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค http://bugs.python.org/issue16298
@silvexis ๋ urllib3 ๋ฒ๊ทธ์ ๋งค์ฐ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค. ์ด์ ๋๊ตฐ๊ฐ @ piotr-dobrogost์ ๋๋ตํ์ผ๋ฉดํฉ๋๋ค.
๋ค๋ฅธ ์ฌ๋์ด ์ฌ์ ํ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ต๋๊น?
๋๋ ๊ทธ๊ฒ์ ๋ํ๋ณด๊ณ ๋ฅผ๋ค์ ์ ์ด ์๋ค. ๋น์ ์?
ํ๋ ์ ์ํฌ๊ฐ ์๋ ๋ฐ์ค ๊ตฌ์ฑ์ ๋ฌธ์ ์
๋๋ค. OS์ ์ปค๋ ๊ตฌ์ฑ์ ์ดํด๋ณด์ญ์์ค. BSD์์๋ kern.maxfiles
ํฉ๋๋ค. Linux ์์คํ
์๋ ulimit
์ ๋ํ ์ค๋ ๋๊ฐ ์์ต๋๋ค. http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in-linux
๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ 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๊ฐ ์์ฒญ์ ์๋ต ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํฉ๋๋ค)
ํ , ๋ซ๋ ์ฌ์ฌ์ ์ด๋์์ ๋์ด ์ก๋์? release_conn()
๋ฅผ ํธ์ถํ๋ Response.close()
๋ฉ์๋๊ฐ ์์ต๋๋ค.์ด ์์
์ ์ํํ๋ ค๋ฉด release_conn()
์์ ์ด๋ค ์ผ์ด ๋ฐ์ํด์ผํฉ๋๊น?
@Lukasa ์ด๊ฒ์ ํ ๋ก ์ ์ผ๋ถ ์๊ธฐ ๋๋ฌธ์ urllib3์์ ํ์คํ ์์ ๋์์ต๋๋ค. ๋ด ์ถ์ ์น์์ ๋ณด์์ ์ธ ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก 1.1.x๊ฐ ์๋๋ผ๋ฉด 1.2.x๋ฅผ ์์ฒญํ๊ธฐ ๋๋ฌธ์ ๊ฑฐ๊ธฐ์ ์๋ค๊ณ ๋งํ ๊ฒ์ ๋๋ค.
๋ค,์ด๊ฒ ๊ณ ์ณ ์ก๋ค๊ณ ์๊ฐ ํ์ด์. 1.2.3์์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณด์ง ์๋ ํ ๊ณ์ํด์ ์ด๊ฒ์ด ์์ ๋์๋ค๊ณ ๊ฐ์ ํ ๊ฒ์ ๋๋ค.
2.0.2์์ CLOSE_WAIT ๋์ถ์ด ๋ฐ์ํ์ต๋๋ค. ์ฃผ์ ์ ๋ํ ํ๊ท๊ฐ ์๋์ง ํ์ธํ๋ ๋จ์ ํ ์คํธ๊ฐ ์์ต๋๊น?
์๋, ๊ทธ๋ ์ง ์์ต๋๋ค. AFAIK urllib3๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋์ถ์ ์ฝ๊ฒ ์ฌํ ํ ์ ์์ต๋๊น?
์์์ผ๋ถํฐ ๋ด๋ถ ์ฑ์์ ์์ฒญ์ ์ฌ์ฉํ์ผ๋ฉฐ ์ค๋์ 1024 ๊ฐ์ maxfiles์ ๋๋ฌํ์ต๋๋ค.
์ฌ๋ถํ ํ 2 ์๊ฐ์ด ์ง๋๋ฉด lsof์์ ๋งํ๋๋ก 40 ๊ฐ์ CLOSE_WAIT๊ฐ ์์ต๋๋ค.
๊ทธ๋์ ์ ๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฌํ ํ ์์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ณ์ ์ฐ๋ฝ ํ ๊ฒ
@tardyp ๋ ์์ฒญ์ ์ด๋ป๊ฒ ์ค์น ํ์ต๋๊น? ๋ชจ๋ OS ํจํค์ง ๊ด๋ฆฌ์๊ฐ urllib3์ ์ ๊ฑฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ต์ ์ํ๋ก ์ ์งํ์ง ์๊ณ ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ๊ทธ ์์ธ์ด ๋ ์ ์์ต๋๋ค. pip๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ด ๋ฌธ์ ์ ํ ๋ก ์ ์ถ๊ฐํ๋ ๋์ ์ ๋ฌธ์ ๋ฅผ ์ด์ด ์ถ์ ํ ์ ์์ต๋๋ค.
pip๋ก ์ค์นํ์ง๋ง python 2.6์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ด ๋ฒ๊ทธ. ์ด์ ๋ฒ์ ์์ํ monkeypatch์
๋๊น?
ํผ์๋ฅด
2013 ๋ 11 ์ 29 ์ผ ๊ธ์์ผ ์คํ 5์ 33 ๋ถ Ian Cordasco [email protected]
@tardyp https://github.com/tardyp ๋ ์์ฒญ์ ์ด๋ป๊ฒ ์ค์น ํ๋์? ๋๋
๋ชจ๋ OS ํจํค์ง ๊ด๋ฆฌ์๊ฐ urllib3์ ์ ๊ฑฐํ๋ค๊ณ ์๊ฐํ์ญ์์ค. ๊ทธ๋ ์ง ์๋ค๋ฉด
์ต์ ์ํ๋ก ์ ์งํ๊ณ ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋์ ์์ธ. pip๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ธ์ ๋ ์ง ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ด์ด
์ด๊ฒ์ ํ ๋ก ์ ์ถ๊ฐํ๋ ๋์ ์ ์ด๊ฒ์ ์ถ์ ํ์ญ์์ค.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ํ์ ํ๊ฑฐ๋ Gi tHub์์ ํ์ธํ์ญ์์ค.
.
@tardyp ์์ฒญ์ ๋ฆฌ๋๋ ์ ์ด ์๋์ง ์ฌ๋ถ์ gevent๋ฅผ ์ฌ์ฉ ์ค์ธ์ง ์ฌ๋ถ๋ฅผ ํฌํจํ์ฌ ๊ฐ๋ฅํ ํ ์์ธํ ๋ด์ฉ์ผ๋ก ์ ๋ฌธ์ ๋ฅผ์ฌ์ญ์์ค. ๋ํ ์ด์ ์ฒด์ ์ ๋ํ ์ธ๋ถ ์ ๋ณด์์ด๋ฅผ ์ฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๋ ํ์์ ์ผ ๊ฒ์ ๋๋ค.
์ฐธ๊ณ ๋ก https://github.com/shazow/urllib3/issues/291 ์ ๋ฒ๊ทธ๋ก ์ธํด ๋๋ ๋ ธ์ต๋๋ค.
๋ค์ ์ด์ด ๋ณผ๊น์?
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค!
@polvoazul ์ด๊ฒ์ด 2011 ๋ ์ ์ฒ์๋ณด๊ณ ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ์ผ
@Lukasa ๋๋ ๋น์ ์ด ๋์์ด ํ์ํฉ๋๋คใ ๋๋ ํญ์ ํ๋กํ ์ฝ์ ์๋ณ ํ ์์๋ ๋๋ฌด ๋ง์ ์๋ง์ ๋ง๋๋ eventlet + ์์ฒญ์ ์ฌ์ฉํฉ๋๋ค. ๋ด ์์ฒญ์ 2.4.3์ ๋๋ค. eventlet + ์์ฒญ ์ด์ด ๋ฌธ์ ๋ฅผ ์ ๋ฐํฉ๋๊น?
@mygoda ๋ฏธ์ํ์ง๋ง ์ ์ ์์ต๋๋ค. ํ ๋ฒ์ ์ฒ๋ฆฌ ํ ์์๋ ์์ฒญ์ ์๋ฅผ ์ ํํ์ง ์๋ ๊ฒฝ์ฐ ํ์คํ ๊ฐ๋ฅํ์ง๋ง ์ด๋ ์์ฒญ์ ์ ์ธํ ์ํคํ ์ฒ ๋ฌธ์ ์ ๋๋ค.
์ง๊ธ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ 120 ๊ฐ์ ์ค๋ ๋๋ฅผ ์คํํ๋ฉด 10 ๋ง ๊ฐ ์ด์์ ์ด๋ฆฐ ํ์ผ์ด ๋ฐ์ํฉ๋๋ค. ์ง๊ธ ๋น์ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@mygoda ๋น์ ์ ๋ฉ์ง ๊ธฐ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
@ 1a1a11a _What_ ํ์ผ์ด ์ด๋ ค ์์ต๋๊น? ์ด ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ๋ฐ ์ ์ฉํ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ ๋๋ค.
@ 1a1a11a ์ด๋ค ๋ฒ์ ์ ์์ฒญ์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ์ด๋ค ๋ฒ์ ์ ํ์ด์ฌ? ์ด๋ค ์ด์ ์ฒด์ ? ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๊น?
์์ฒญ 2.9.1, python 3.4, ์ฐ๋ถํฌ 14.04๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก 30 ๊ฐ์ ์ค๋ ๋๋ฅผ ํ๋ก์์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ผ๋ถ ์น ์ฌ์ดํธ๋ฅผ ํฌ๋กค๋งํ๋ ํฌ๋กค๋ฌ๋ฅผ ์์ฑํ๊ณ ์์ต๋๋ค. ํ์ฌ ํ๋ก์ธ์ค ๋น ํ์ผ ์ ํ์ 655350์ผ๋ก ์กฐ์ ํ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ๋ณด๊ณ ๋ฉ๋๋ค.
requests.packages.urllib3.connection.VerifiedHTTPSConnection์์ "Failed to set a new connection : [Errno 24] Too many open files"๋ผ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๊ณ์ ๋ํ๋ฉ๋๋ค. Python 3.4, ์์ฒญ 2.11.1 ๋ฐ requests-futures๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. 0.9.7. requests-futures๋ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ์ ์ ๊ฐ์ฌํ์ง๋ง ์์ฒญ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค. SSL์ ํตํด 180k ๋น๋๊ธฐ ์์ฒญ์ ์๋ํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์์ฒญ์ 1000 ๊ฐ์ ์ธ๊ทธ๋จผํธ๋ก ๋๋์์ต๋๋ค. ๋ฏธ๋์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ํด๊ฒฐ ๋ ํ์ ๋ง โโ๋ค์ 1000 ๊ฐ๋ก ์ด๋ํฉ๋๋ค. Ubuntu 16.04.2๋ฅผ ์คํ ์ค์ด๊ณ ๊ธฐ๋ณธ ์ด๋ฆฐ ํ์ผ ์ ํ์ 1024์ ๋๋ค.์ด ์ค๋ฅ์ ๊ทผ๋ณธ์ ์ธ ์์ธ์ ์ดํดํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์์ฒญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฑํฉ๋๊น? ๊ฐ ๊ฐ๋ณ ์์ฒญ์ ๋ํด ์ด๋ฆฐ ํ์ผ์ ๋๊น? ๊ทธ๋ ๋ค๋ฉด ๊ทธ ์ด์ ๋ ๋ฌด์์ ๋๊น? SSL ์ธ์ฆ์ ํ์ผ์ ๋๊น? ๊ทธ๋ฆฌ๊ณ ์์ฒญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํฅํ ๊ฐ์ฒด๊ฐ ํด๊ฒฐ ๋ ๋ ์ด๋ฆฐ ํ์ผ์ ์๋์ผ๋ก ๋ซ์ต๋๊น?
์์ฒญ์ ๋ง์ ํ์ผ์ ์ฝ๋ ๋ค. ์ด๋ฌํ ํ์ผ ์ค ์ผ๋ถ๋ ์ธ์ฆ์ ์ฉ์ผ๋ก ์ด๋ฆฌ์ง ๋ง ์์ฒญ์ด ์๋ OpenSSL์ ์ํด ์ด๋ฆฌ๋ฏ๋ก ์ ์ง๋์ง ์์ต๋๋ค. ๋ํ ์์ฒญ์ ํ์ํ ๊ฒฝ์ฐ .netrc
ํ์ผ, ํธ์คํธ ํ์ผ ๋ฐ ๊ธฐํ ์ฌ๋ฌ ํ์ผ๋ ์ฝ๋ ๋ค.
strace
์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค ํ์ผ์ด ์ด๋ ค ์๋์ง ํ์ธํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ํ ๋น๋๋๋กํ๋ ์์คํ
ํธ์ถ์ ์๊ฒฉํ ๋ชฉ๋ก์ด ์์ผ๋ฏ๋ก ํฉ๋ฆฌ์ ์ผ๋ก ์ ์ํ๊ฒ ์ด๊ฑฐ ํ ์ ์์ด์ผํฉ๋๋ค. ๋ํ ๋ฌธ์ ๊ฐ ์๋์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ค๋๋ค. ํ์ง๋ง ์, HTTPS๋ฅผ ํตํด 1000 ๊ฐ์ ์ฐ๊ฒฐ์ ์ ๊ทน์ ์ผ๋ก ์ํ ํ๋ ๊ฒฝ์ฐ ์ต๋๋ก๋์ 1000 ๊ฐ ์ด์์ FD๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๋๋์ด ๋ฌธ์ ๋ก๋ ์ด๋ ค์์ ๊ฒช์๊ณ OS X์์ opensnoop
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ ๋ฌธ์ ์ ๋ถ๋ชํ๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๊ณ ์๋์ง ์ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค.
๋ํ HTTP
(HTTPS ์๋) ์๋ฒ์ requests.post(url, data=data)
์ ๋ฐ๋ณตํด์ ํธ์ถ ํ ๋์ด ์ค๋ฅ๊ฐ ์์ฃผ ํ์๋ฉ๋๋ค. Ubuntu 16.04.3, Python 3.5.2์์ ์คํ, 2.9.1 ์์ฒญ
data
๋ฌด์์
๋๊น?
์๋ฐฑ kb ํ ์คํธ
ํ์ผ ๊ฐ์ฒด๊ฐ ์๋๋๊น?
์๋์, ๋ฉ๋ชจ๋ฆฌ์ ํฐ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
์ด ์ฝ๋๋ฅผ ์ฌ๋ฌ ์ค๋ ๋์์ ์คํํ๊ณ ์์ต๋๊น?
์๋์, ๋จ์ผ ์ค๋ ๋, localhost์ ๊ฒ์
๊ทธ๋ ๊ฒ ๋ง์ FD๋ฅผ ์ ์ถํ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅ ํด ๋ณด์ ๋๋ค. ๋์ผํ TCP ์ฐ๊ฒฐ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ ํ๊ฑฐ๋ ๊ณต๊ฒฉ์ ์ผ๋ก ๋ซ์์ผํฉ๋๋ค. ์๋ฒ์ ์ฑ๋ฅ์ ํ์ธํ๊ณ ์ถ์ผ์ญ๋๊น?
์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Python 2.7, ์์ฒญ 2.18.4, urllib3 1.22.
๋ค์ค ์ค๋ ๋ ์ฝ๋ ์คํ (๋ค์ค ์ฒ๋ฆฌ ์๋). ํ ๋ฒ์ ์ต๋ 6 ๊ฐ์ URL์ ์ฐ๊ฒฐํ๊ณ ๊ฐ URL์ ๋ํด ์๋์ผ๋ก ์ ์ธ์
์ ๋ง๋ค๊ณ ๋ซ์ต๋๋ค.
Python 3.5
, requests==2.18.4
์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@mcobzarenco ์๋ต์ ๊ธฐ๋ณธ ์ฐ๊ฒฐ์ (์์ ์ ์ผ๋ก) ๋ซ๊ณ ์์ต๋๊น? ์๋ต์ ๋ฐํํ๋ค๊ณ ํด์ ์ฐ๊ฒฐ์ด ๋์ด์ง์ง๋ ์์ต๋๋ค. response.content๋ฅผ ์ฝ์ ๋ ๋ฐ์ดํฐ๋ ์ค์ ๋ก ์ฝํ๊ณ ๊ทธ ํ์ ์์ผ์ CLOSE_WAIT์ ๋จธ๋ฌผ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
"์ด๋ฆฐ ํ์ผ์ด ๋๋ฌด ๋ง์"์ ์์ผ์ด CLOSE_WAIT์ ๋จธ๋ฌผ๋ฌ์ ๋ฐ์ํ๋ ๋ฒ๊ทธ์ ๊ฒฐ๊ณผ์ ๋๋ค.
๊ทธ๋์ ulimit๋ ํด๊ฒฐํ์ง ์์ต๋๋ค.