H2o: h2o_buffer_reserve()에 MAP_SHAREDκ°€ ν•„μš”ν•œ 이유

에 λ§Œλ“  2017λ…„ 12μ›” 30일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: h2o/h2o

https://github.com/h2o/h2o/blob/master/lib/common/memory.c#L272

μ•‘μ„ΈμŠ€ν•  λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μžˆμŠ΅λ‹ˆκΉŒ? 그렇지 μ•Šμ€ 경우 MAP_PRIVATE μ„€μ •ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

λ˜ν•œ mremap을 μ§€μ›ν•˜λŠ” ν”Œλž«νΌμ—μ„œ mmap(2) 및 munmap(2) λŒ€μ‹  mremap(2)을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ•‘μ„ΈμŠ€ν•  λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μžˆμŠ΅λ‹ˆκΉŒ? 그렇지 μ•Šμ€ 경우 MAP_PRIVATEλ₯Ό μ„€μ •ν•˜μ§€ μ•ŠλŠ” 이유

mktemps + fallocate + mmap을 μ‚¬μš©ν•˜λŠ” λͺ©μ μ€ 데이터 버퍼링에 μ‚¬μš©ν•  수 μžˆλŠ” μ΅œλŒ€ 곡간이 swap_ λŒ€μ‹  _λ””μŠ€ν¬μ˜ μ—¬μœ  곡간에 μ˜ν•΄ μ œν•œλ˜λ„λ‘ 파일 지원 버퍼λ₯Ό λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. MAP_PRIVATE 이 λͺ©ν‘œμ™€ μΆ©λŒν•©λ‹ˆλ‹€.

λ˜ν•œ mremap을 μ§€μ›ν•˜λŠ” ν”Œλž«νΌμ—μ„œ mmap(2) 및 munmap(2) λŒ€μ‹  mremap(2)을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μΆ”κ°€λœ νŽ˜μ΄μ§€κ°€ 읡λͺ…이 μ•„λ‹ˆλΌλŠ” κ°€μ • ν•˜μ— κ°€λŠ₯ν•©λ‹ˆλ‹€. λ˜ν•œ mremap μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯이 λˆˆμ— λ„κ²Œ λ³€κ²½λ˜λ©΄ λ§€ν•‘λœ νŽ˜μ΄μ§€λ₯Ό 맀핑 ν•΄μ œ(영ꡬ적으둜 λ˜λŠ” λ‹€μ‹œ λ§€ν•‘μ˜ μΌλΆ€λ‘œ)ν•œ ν›„ νŽ˜μ΄μ§€κ°€ 이동될 κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λŠ” 방법을 μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€. κ°€μž₯ λΉ„μš©μ΄ 많이 λ“œλŠ” μž‘μ—…μž…λ‹ˆλ‹€. 그리고 이것이 λ°˜λ“œμ‹œ mremap μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λŠ” μ˜λ―ΈλŠ” μ•„λ‹™λ‹ˆλ‹€.

μ–΄μ¨Œλ“  λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό λ²„νΌλ§ν•˜λŠ” 것은 뢀차적인 μ „λž΅μ΄λ©° μ„±λŠ₯ ν–₯상에 λ…Έλ ₯을 κΈ°μšΈμ΄λŠ” 것은 쒋지 μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν”„λ‘μ‹œ 처리기 μ΄μ™Έμ˜ μ²˜λ¦¬κΈ°μ— 슀트리밍 μš”μ²­(#1357 μ°Έμ‘°)을 μ±„νƒν•˜λŠ” μž‘μ—…μ„ μ„ ν˜Έν•©λ‹ˆλ‹€.

λͺ¨λ“  3 λŒ“κΈ€

μ•‘μ„ΈμŠ€ν•  λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μžˆμŠ΅λ‹ˆκΉŒ? 그렇지 μ•Šμ€ 경우 MAP_PRIVATEλ₯Ό μ„€μ •ν•˜μ§€ μ•ŠλŠ” 이유

mktemps + fallocate + mmap을 μ‚¬μš©ν•˜λŠ” λͺ©μ μ€ 데이터 버퍼링에 μ‚¬μš©ν•  수 μžˆλŠ” μ΅œλŒ€ 곡간이 swap_ λŒ€μ‹  _λ””μŠ€ν¬μ˜ μ—¬μœ  곡간에 μ˜ν•΄ μ œν•œλ˜λ„λ‘ 파일 지원 버퍼λ₯Ό λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. MAP_PRIVATE 이 λͺ©ν‘œμ™€ μΆ©λŒν•©λ‹ˆλ‹€.

λ˜ν•œ mremap을 μ§€μ›ν•˜λŠ” ν”Œλž«νΌμ—μ„œ mmap(2) 및 munmap(2) λŒ€μ‹  mremap(2)을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μΆ”κ°€λœ νŽ˜μ΄μ§€κ°€ 읡λͺ…이 μ•„λ‹ˆλΌλŠ” κ°€μ • ν•˜μ— κ°€λŠ₯ν•©λ‹ˆλ‹€. λ˜ν•œ mremap μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯이 λˆˆμ— λ„κ²Œ λ³€κ²½λ˜λ©΄ λ§€ν•‘λœ νŽ˜μ΄μ§€λ₯Ό 맀핑 ν•΄μ œ(영ꡬ적으둜 λ˜λŠ” λ‹€μ‹œ λ§€ν•‘μ˜ μΌλΆ€λ‘œ)ν•œ ν›„ νŽ˜μ΄μ§€κ°€ 이동될 κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λŠ” 방법을 μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€. κ°€μž₯ λΉ„μš©μ΄ 많이 λ“œλŠ” μž‘μ—…μž…λ‹ˆλ‹€. 그리고 이것이 λ°˜λ“œμ‹œ mremap μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λŠ” μ˜λ―ΈλŠ” μ•„λ‹™λ‹ˆλ‹€.

μ–΄μ¨Œλ“  λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό λ²„νΌλ§ν•˜λŠ” 것은 뢀차적인 μ „λž΅μ΄λ©° μ„±λŠ₯ ν–₯상에 λ…Έλ ₯을 κΈ°μšΈμ΄λŠ” 것은 쒋지 μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν”„λ‘μ‹œ 처리기 μ΄μ™Έμ˜ μ²˜λ¦¬κΈ°μ— 슀트리밍 μš”μ²­(#1357 μ°Έμ‘°)을 μ±„νƒν•˜λŠ” μž‘μ—…μ„ μ„ ν˜Έν•©λ‹ˆλ‹€.

buffering large amount of data is a secondary strategy κ°€ ν¬μΈνŠΈμž…λ‹ˆλ‹€.
ν”„λ‘œκ·Έλž¨μ΄ mktemps + fallocate + mmap 거의 빠지지 μ•ŠλŠ”λ‹€κ³  μΆ”μΈ‘ν•˜μ‹­μ‹œμ˜€.

큰 버퍼가 ν•„μš”ν•˜μ§€ μ•Šμ€ ν•Έλ“€λŸ¬μ—μ„œ μ²˜λ¦¬ν•˜λŠ” 슀트리밍 μš”μ²­, λ§žμŠ΅λ‹ˆκΉŒ?

제 μƒκ°μ—λŠ” 곡유 λ˜λŠ” λΉ„κ³΅κ°œ mmap λ¦¬μ†ŒμŠ€(μž„μ‹œ μ—…λ‘œλ“œ 자리 ν‘œμ‹œμžμΌμ§€λΌλ„)λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 λ‚˜μœ μƒκ°μž…λ‹ˆλ‹€. $TMP λ˜λŠ” $TMPDIR μœ„μΉ˜λŠ” μ‚¬μš©μž ν™˜κ²½μ˜ λͺ¨λ“  것이 될 수 있으며, 예λ₯Ό λ“€μ–΄ HDDκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€. κ΄€λ¦¬μžκ°€ κΈ°μ–΅ν•΄μ•Ό ν•˜λŠ” μΆ”κ°€ 단계일 λΏμž…λ‹ˆλ‹€. $TMPκ°€ ramdisk 마운트인 경우 λŒ€μš©λŸ‰ 파일의 λ™μ‹œ μ—…λ‘œλ“œλŠ” λ©”λͺ¨λ¦¬ μ••λ ₯을 μ‰½κ²Œ 생성할 수 μžˆλ‹€λŠ” 것은 말할 것도 μ—†μŠ΅λ‹ˆλ‹€.

λΉ„ ν”„λ‘μ‹œ 처리기둜 슀트리밍 μš”μ²­ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 μžˆμ–΄ κ·€ν•˜μ˜ μ œμ•ˆκ³Ό λ°©ν–₯이 맀우 λ§ˆμŒμ— λ“­λ‹ˆλ‹€. κΈ°λŒ€ν•˜κ³  ν…ŒμŠ€νŠΈν•  μ€€λΉ„κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰