Libseccomp: RFE: seccomp_rule_addκ°€ v2.4.0 μ΄ν›„λ‘œ 맀우 λŠλ €μ‘ŒμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2019λ…„ 05μ›” 01일  Β·  23μ½”λ©˜νŠΈ  Β·  좜처: seccomp/libseccomp

μ•ˆλ…•ν•˜μ„Έμš”,
이 λ¬Έμ œλŠ” v2.3.3κ³Ό v2.4.0 μ‚¬μ΄μ˜ 컀밋 ce3dda9a1747cc6a4c044eafe5a2eb653c974919에 μ˜ν•΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ 예λ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€. foo.c.zip .
그것은 맀우 λ§Žμ€ 수의 κ·œμΉ™μ„ μΆ”κ°€ν•©λ‹ˆλ‹€. 그리고 μœ„μ—μ„œ μ–ΈκΈ‰ν•œ 컀밋 ν›„ μ•½ 100λ°° 느리게 μž‘λ™ν•©λ‹ˆλ‹€.

foo.c v2.4.1을 μ‚¬μš©ν•œ μ‹€ν–‰ μ‹œκ°„: 0.448
foo.c v2.3.3을 μ‚¬μš©ν•œ μ‹€ν–‰ μ‹œκ°„: 0.077

λ‚˜λŠ” 쑰금 파고 db_col_transaction_start()κ°€ 이미 μ‘΄μž¬ν•˜λŠ” ν•„ν„° μ»¬λ ‰μ…˜μ„ λ³΅μ‚¬ν•˜κ³  arch_filter_rule_add()λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•„ν„° κ·œμΉ™μ„ λ³΅μ œν•œλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ arch_filter_rule_add()λŠ” arch_syscall_translate()λ₯Ό ν˜ΈμΆœν•˜κ³  μ΄λŠ” arch_syscall_resolve_name()을 ν˜ΈμΆœν•˜λ©° μ΄λŠ” O(주어진 μ•„ν‚€ν…μ²˜μ˜ μ‹œμŠ€ν…œ 호좜 수)μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. λ”°λΌμ„œ ν•˜λ‚˜μ˜ κ·œμΉ™μ„ μΆ”κ°€ν•˜λŠ” 것은 IMOκ°€ 정말 λ‚˜μœ O(이미 μΆ”κ°€λœ κ·œμΉ™μ˜ 수 * μ‚¬μš©λœ μ•„ν‚€ν…μ²˜μ˜ μ‹œμŠ€ν…œ 호좜 수)μ—μ„œ 적어도 μž‘λ™ν•©λ‹ˆλ‹€.
μœ„μ˜ μ˜ˆμ—μ„œ arch_filter_rule_add() 에 λŒ€ν•œ 호좜 수λ₯Ό μ„Έμ—ˆκ³  201152 와 κ°™μŠ΅λ‹ˆλ‹€.

κ·Έ 컀밋 μ΄μ „μ—λŠ” arch_filter_rule_add()에 λŒ€ν•œ 호좜 νšŸμˆ˜κ°€ 896 . 그리고 λ‚΄κ°€ μ½”λ“œμ—μ„œ μ΄ν•΄ν•œ 바에 λ”°λ₯΄λ©΄ db_col_transaction_start()도 이미 μ‘΄μž¬ν•˜λŠ” ν•„ν„° μ»¬λ ‰μ…˜μ„ λ³΅μ‚¬ν•˜κ³  arch_filter_rule_add()λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. O(이미 μΆ”κ°€λœ κ·œμΉ™μ˜ 수 + 주어진 μ•„ν‚€ν…μ²˜μ— λŒ€ν•œ μ‹œμŠ€ν…œ 호좜의 수)에 λŒ€ν•œ κ·œμΉ™μ„ μΆ”κ°€ν•˜λŠ” μ‹œκ°„μ΄ 훨씬 더 μ’‹μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ IMOλŠ” n개의 κ·œμΉ™μ„ μΆ”κ°€ν•˜λŠ” 것이 O(n^2)μ—μ„œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— 이미 μΆ”κ°€λœ κ·œμΉ™μ˜ μˆ˜μ™€ κ΄€λ ¨λ˜μ–΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것은 λ‹€λ₯Έ λ…Όμ˜μ˜ μ£Όμ œμ΄λ―€λ‘œ μž‘μ€ ν•„ν„°λ‚˜ λ“œλ¬Όκ²Œ μƒμ„±λ˜λŠ” ν•„ν„°μ—λŠ” λ¬Έμ œκ°€ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œκ°€ μ€‘μš”ν•œ μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?
일뢀 ν•„ν„°λŠ” μ‹€ν–‰ ν”„λ‘œκ·Έλž¨ PIDκ°€ ν•„μš”ν•©λ‹ˆλ‹€(예: μŠ€λ ˆλ“œκ°€ μžμ‹ μ—κ²Œλ§Œ μ‹ ν˜Έλ₯Ό 보낼 수 μžˆλ„λ‘ ν—ˆμš©). λ”°λΌμ„œ μ œν•œλœ ν”„λ‘œκ·Έλž¨μ„ μƒλ‹Ήν•œ 횟수 μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” 경우 맀우 λˆˆμ— λ„λŠ” μ˜€λ²„ν—€λ“œκ°€ λ©λ‹ˆλ‹€. μ•½ 300개 κ·œμΉ™μ˜ ν•„ν„°κ°€ 있고 libseccomp μ˜€λ²„ν—€λ“œλŠ” μƒŒλ“œλ°•μŠ€ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰λ‹Ή μ•½ 0.16μ΄ˆμž…λ‹ˆλ‹€(ν”„λ‘œμ„ΈμŠ€λ₯Ό μˆ˜μ‹­ 번 μ‹€ν–‰).

λ‹Ήμ‹ μ˜ 도움에 미리 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

enhancement prioritlow

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

이 λ³€κ²½μœΌλ‘œ 인해 μ‚¬μš©μžμ˜ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 정말 μ—„μ²­λ‚œ μ†λ„λ§ŒνΌ 속도가 λŠλ €μ‘ŒμŠ΅λ‹ˆλ‹€.

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

μ•ˆλ…•ν•˜μ„Έμš” @varqoxμž…λ‹ˆλ‹€.

예, syscall 리쑸버 ν•¨μˆ˜λŠ” μ•½κ°„μ˜ κ°œμ„ μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ μ½”λ“œλ₯Ό 보면 λ‹€μŒκ³Ό 같은 λͺ‡ 가지 주석이 ν‘œμ‹œλ©λ‹ˆλ‹€.

/* XXX - plenty of room for future improvement here */

ν•΄λ‹Ή μ½”λ“œλ₯Ό κ°œμ„ ν•˜λ €λŠ” 경우 도움말을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

@pcmooreκ°€ μ–ΈκΈ‰ν–ˆλ“―μ΄ libseccomp λ₯Ό μ‚¬μš©ν•˜μ—¬ seccomp ν•„ν„°μ˜ _생성_ 속도λ₯Ό 높일 수 μžˆλŠ” μΆ©λΆ„ν•œ κΈ°νšŒκ°€ μžˆμŠ΅λ‹ˆλ‹€. μœ„μ—μ„œ κ·€ν•˜μ˜ μ—°κ΅¬λŠ” κ°œμ„ μ„ μ‚¬μš©ν•  수 μžˆλŠ” μ—¬λŸ¬ μ˜μ—­ 쀑 ν•˜λ‚˜λ₯Ό μ„€λͺ…ν–ˆμŠ΅λ‹ˆλ‹€. 이것은 λ‚΄ μ‚¬μš©μžμ— λŒ€ν•œ μš°λ €κ°€ μ•„λ‹ˆλ―€λ‘œ 그것에 μ§‘μ€‘ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

_runtime_ μ„±λŠ₯κ³Ό κ΄€λ ¨ν•˜μ—¬ μ €λŠ” ν˜„μž¬ foo.cμ—μ„œ μ œκ³΅ν•œ 것과 같은 큰 필터에 이진 트리λ₯Ό μ‚¬μš©ν•˜λŠ” μž‘μ—…μ„ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‚΄λΆ€ 고객의 초기 κ²°κ³ΌλŠ” μœ λ§ν•΄ λ³΄μ΄μ§€λ§Œ λ³€κ²½ 사항에 λŒ€ν•΄ 또 λ‹€λ₯Έ μ‹œκ°μ„ μ–»κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. ν’€ λ¦¬ν€˜μŠ€νŠΈ μ°Έμ‘° https://github.com/seccomp/libseccomp/pull/152

μ•Œκ² μŠ΅λ‹ˆλ‹€. syscall 해결이 κ°œμ„ λ  수 μžˆμ§€λ§Œ 문제의 κ·Όλ³Έ 원인은 μ•„λ‹™λ‹ˆλ‹€. λ‚΄κ°€ 보기 에 db_col_transaction_start() μ—μ„œ μŠ€λƒ…μƒ·μ„ μƒμ„±ν•˜λŠ” 것 μž…λ‹ˆλ‹€. μ›λž˜ κ·œμΉ™μ—μ„œ ν•΄κ²°λœ syscall을 ν•΄κ²°ν•˜κΈ° λ•Œλ¬Έμ— 느린 arch_filter_rule_add() κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

λ‚˜λŠ” 그것을 λ‹€μŒκ³Ό 같이 λ³Έλ‹€: μš°λ¦¬λŠ” λͺ¨λ“  κ·œμΉ™κ³Ό ν•¨κ»˜ ν˜„μž¬ ν•„ν„°μ˜ 전체 μ„ΈνŠΈ(일λͺ… struct db_filter)λ₯Ό λ³΅μ œν•˜κΈ°λ₯Ό μ›ν•˜λ―€λ‘œ μš°λ¦¬κ°€ 이미 가지고 μžˆλŠ” λͺ¨λ“  ν•„ν„°λ₯Ό _볡사_ν•˜λŠ” λŒ€μ‹  μ²˜μŒλΆ€ν„° λͺ¨λ“  ν•„ν„°λ₯Ό _ꡬ성_ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” μ²˜μŒλΆ€ν„° λ§Œλ“€ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” 단지 볡사본을 μ›ν•˜λŠ” μ™„μ „ν•œ λΉŒλ“œ ν•„ν„°λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. μ œκ°€ λ†“μΉœ 뢀뢄이 μžˆμ„μ§€λ„ λͺ¨λ₯΄μ§€λ§Œ db_col_transaction_start() ν•¨μˆ˜μ— λ§Žμ€ κ°œμ„ μ΄ 이루어진 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚΄λΆ€ libseccomp db μ»¬λ ‰μ…˜μ˜ λͺ¨λ“  μƒνƒœμ—μ„œ 이λ₯Ό λ³΅μ œν•˜λŠ” 것은 κ°„λ‹¨ν•œ μž‘μ—…μ΄ μ•„λ‹ˆλ―€λ‘œ μ›λž˜ κ·œμΉ™μ—μ„œ μ»¬λ ‰μ…˜μ„ μž¬μƒμ„±ν•˜λŠ” 것이 훨씬 μ‰½μŠ΅λ‹ˆλ‹€(μ½”λ“œ κ΄€μ μ—μ„œ). μ›λž˜ κ·œμΉ™μ„ μΆ”μ ν•˜λ©΄ κΈ°μ‘΄ κ·œμΉ™μ„ "제거"ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€(ν–₯ν›„ κΈ°λŠ₯ κ°€λŠ₯).

이것은 νŠΈλžœμž­μ…˜ μ½”λ“œκ°€ κ°œμ„ λ  수 μ—†λ‹€λŠ” 것을 λ§ν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. ν™•μ‹€νžˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν˜„μž¬ μ½”λ“œλŠ” 기본적으둜 λ‹¨μˆœν•¨ λ•Œλ¬Έμ— μžˆλŠ” κ·ΈλŒ€λ‘œμž…λ‹ˆλ‹€.

이 λ³€κ²½μœΌλ‘œ 인해 μ‚¬μš©μžμ˜ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 정말 μ—„μ²­λ‚œ μ†λ„λ§ŒνΌ 속도가 λŠλ €μ‘ŒμŠ΅λ‹ˆλ‹€.

또 λ‹€λ₯Έ μƒκ°μœΌλ‘œ, 전체 νŠΈλ¦¬κ°€ μ•„λ‹Œ νŠΈλžœμž­μ…˜ μ‹œμž‘ μ‹œ κ·œμΉ™λ§Œ λ³΅μ œν•˜κ³  μ‹€νŒ¨ν•œ νŠΈλžœμž­μ…˜μ—μ„œλ§Œ 트리λ₯Ό μž¬μƒμ„±ν•˜λ„λ‘ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ™„λ²½ν•˜μ§€λŠ” μ•Šμ§€λ§Œ μƒλ‹Ήν•œ μ‹œκ°„μ„ λ˜λŒλ €μ•Ό ν•©λ‹ˆλ‹€.

μ»¨ν…Œμ΄λ„ˆ 및 exec ν”„λ‘œμ„ΈμŠ€μ˜ μ‹œμž‘ μ‹œκ°„μœΌλ‘œ 인해 μ„±λŠ₯이 크게 μ €ν•˜λ˜κ³  μ‚¬λžŒλ“€μ΄ 2.3배둜 κ³ μ •λ˜κΈ° λ•Œλ¬Έμ— μš°λ¦¬λŠ” 무언가λ₯Ό ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 문제의 _"κ±°λŒ€ν•œ"_ νŠΉμ„±μ— λŒ€ν•΄ 더 이상 μ–ΈκΈ‰ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. κ·Έ 관점은 이미 μ—¬λŸ¬ 번 λ§Œλ“€μ–΄μ‘ŒμœΌλ©° μƒλŒ€μ μ΄κ³  μ‚¬μš© 사둀에 따라 의쑴적이라고 μƒκ°ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ v2.4 μ΄μ „μ˜ libseccomp λ¦΄λ¦¬μŠ€λŠ” 곡개된(문제 #139) 잠재적인 취약점에 μ·¨μ•½ν•˜λ‹€λŠ” 점을 λͺ¨λ‘μ—κ²Œ μƒκΈ°μ‹œν‚€κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œκ°€ κ±±μ •λ˜λŠ” 뢄듀을 μœ„ν•΄ ν˜„μž¬ v2.5 릴리슀둜 ν‘œμ‹œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

λ¦¬νŒ©ν† λ§μ„ ν–ˆκ³  λ§ˆμ΄λ„ˆ λ¦΄λ¦¬μŠ€μ—μ„œ "κ±°λŒ€ν•œ" μ„±λŠ₯ 영ν–₯을 미치며 μ‚¬μš© 사둀에 따라 λ‹€λ₯΄λ‹€κ³  λ§ν•¨μœΌλ‘œμ¨ 도움이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 배포판이 2.4둜 μ—…λ°μ΄νŠΈλ¨μ— 따라 μ‚¬λžŒλ“€μ΄ μ•Œμ•„μ°¨λ¦¬κΈ° μ‹œμž‘ν•  것이기 λ•Œλ¬Έμ— 이것을 μ§„μ§€ν•˜κ²Œ λ°›μ•„λ“€μ΄μ‹­μ‹œμ˜€.

@crosbymichael λ³€κ²½ 사항은 λ‹¨μˆœν•œ λ¦¬νŒ©ν† λ§μ΄ μ•„λ‹ˆλΌ 문제λ₯Ό μˆ˜μ •ν•˜κ³  μ»€λ„μ˜ λ³€κ²½ 사항을 μ§€μ›ν•˜λŠ” 데 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€(특히 32λΉ„νŠΈ x86의 μ†ŒμΌ“ μ‹œμŠ€ν…œ 호좜과 같이 닀쀑화 및 직접 호좜 μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ λͺ¨λ‘ 지원해야 ν•  ν•„μš”κ°€ 있음).

λ‚˜λŠ” 이것을 λ‚ λ € λ²„λ¦¬λŠ” 것이 _μ•„λ‹™λ‹ˆλ‹€_, 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법에 λŒ€ν•΄ 계속 μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€(μœ„μ˜ λ‚΄ μ„€λͺ… μ°Έμ‘°). 그리고 λ‚΄κ°€ 이것을 λ‹€μŒ λ§ˆμ΄λ„ˆ 릴리슀λ₯Ό μœ„ν•œ κ²ƒμœΌλ‘œ ν‘œμ‹œν–ˆλ‹€λŠ” μ‚¬μ‹€μž…λ‹ˆλ‹€. ν˜„μ‹œμ μ—μ„œλŠ” 선동적인 λŒ“κΈ€λ‘œ μΈμ‹ν•˜κΈ° μ–΄λ €μš°λ‹ˆ, μ˜λ„κ°€ μ•„λ‹ˆλΌλ©΄ μ•žμœΌλ‘œ λŒ“κΈ€μ„ 달 λ•Œ μ’€ 더 μ‹ κ²½μ¨μ£Όμ…¨μœΌλ©΄ ν•©λ‹ˆλ‹€. 이 문제의 진행 상황이 λ§ˆμŒμ— 듀지 μ•ŠμœΌλ©΄ κ²€ν† λ₯Ό μœ„ν•΄ 패치/PR을 μ œμΆœν•˜μ—¬ μ–Έμ œλ“ μ§€ 도움을 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

μžμ‹ κ³Ό λ‹€λ₯Έ μ‚¬λžŒμ΄ 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ κ³ λ € 쀑인 λͺ¨λ“  μ‚¬λžŒμ—κ²Œ μ£Όμ˜ν•˜μ‹­μ‹œμ˜€.

λ‚˜λŠ” μ΅œκ·Όμ— μš°λ¦¬κ°€ κ±°λž˜μ™€ κ΄€λ ¨ν•˜μ—¬ μš°λ¦¬κ°€ ν•˜λŠ” 일을 ν•˜λŠ” 이유λ₯Ό μƒκΈ°ν–ˆμŠ΅λ‹ˆλ‹€(λͺ¨λ“  것을 미리 볡사). μ‹€νŒ¨ 없이 νŠΈλžœμž­μ…˜μ„ λ‘€λ°±ν•  수 μžˆμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 이 μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ™œμš”?
정상적인 seccomp_rule_add() μž‘μ—…μ€ μž₯μ• κ°€ λ°œμƒν•œ κ²½μš°μ—λ„ ν•„ν„°λ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€. 일반 κ·œμΉ™ μΆ”κ°€μ˜ μΌλΆ€λ‘œ 닀쀑 λΆ€λΆ„ νŠΈλžœμž­μ…˜(예: x86/s390/s390x/etc의 socket/ipc syscalls)에 μ‹€νŒ¨ν•˜λ©΄ 였λ₯˜ 없이 νŠΈλžœμž­μ…˜ μ‹œμž‘ μ‹œ ν•„ν„°λ‘œ 되돌릴 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€( λ©”λͺ¨λ¦¬ μ••λ ₯ 등에 관계없이).

κ·œμΉ™ 없이 트리λ₯Ό λ³΅μ œν•˜λŠ” 것은 트리의 νŠΉμ„±κ³Ό 트리 λ‚΄λΆ€μ˜ μ—°κ²°λ‘œ 인해 κ³„μ†ν•΄μ„œ μ–΄λ €μšΈ κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚΄λΆ€ νŠΈλžœμž­μ…˜μ„ 생성해야 ν•  λ•Œλ₯Ό μ„ νƒμ μœΌλ‘œ 선택할 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. ν•„μš”ν•˜μ§€ μ•Šμ€ 경우.

λ‚˜λŠ” 이것을 λ³΄λŠ” 데 쑰금 더 λ§Žμ€ μ‹œκ°„μ„ ν• μ• ν–ˆκ³  κ·œμΉ™ μΆ”κ°€ 쀑에 μ˜μ‚¬ κ²°μ • 트리λ₯Ό 파괴적으둜 μˆ˜μ •ν•˜λŠ” 방식 λ•Œλ¬Έμ— κ·œμΉ™ μΆ”κ°€λ₯Ό νŠΈλžœμž­μ…˜μœΌλ‘œ λž˜ν•‘ν•˜λŠ” 것을 ν”Όν•  수 μžˆμ„μ§€ 확신이 μ„œμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이것은 λ‚΄λΆ€μ μœΌλ‘œ νŠΈλžœμž­μ…˜ μ‚¬μš©μ„ μ œν•œν•˜λŠ” 방법을 μ°ΎλŠ” λŒ€μ‹  속도λ₯Ό λ†’μ΄λŠ” 방법을 μ°Ύμ•„μ•Ό 함을 μ˜λ―Έν•©λ‹ˆλ‹€. κ³ λ§™κ²Œλ„ 해결책을 찾은 것 κ°™μŠ΅λ‹ˆλ‹€. λ°”λ‘œ 그림자 λ‚˜λ¬΄μž…λ‹ˆλ‹€.

ν˜„μž¬ μš°λ¦¬λŠ” μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜μ„ 생성할 λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ 트리λ₯Ό λ§Œλ“€κ³  성곡 μ‹œ νκΈ°ν•©λ‹ˆλ‹€. μš°λ¦¬κ°€ λ³΄μ•˜λ“―μ΄ 일뢀 μ‚¬μš© μ‚¬λ‘€μ—μ„œλŠ” μ—„μ²­λ‚˜κ²Œ 느릴 수 μžˆμŠ΅λ‹ˆλ‹€. 제 생각은 컀밋 μ‹œ 쀑볡 트리λ₯Ό λ²„λ¦¬λŠ” λŒ€μ‹  방금 μΆ”κ°€ν•œ κ·œμΉ™μ„ 쀑볡 νŠΈλ¦¬μ— μΆ”κ°€(ν˜„μž¬ ν•„ν„°μ˜ 볡사본 λ§Œλ“€κΈ°)ν•˜κ³  "섀도 νŠΈλžœμž­μ…˜"으둜 μœ μ§€ν•˜μ—¬ λ‹€μŒ 속도λ₯Ό λ†’μ΄λŠ” κ²ƒμž…λ‹ˆλ‹€. νŠΈλžœμž­μ…˜ μŠ€λƒ…μƒ·. λͺ‡ 가지 μ°Έκ³  사항:

  • db_col_transaction_start() λŠ” μ‘΄μž¬ν•˜λŠ” 경우 섀도 νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜λ €κ³  μ‹œλ„ν•΄μ•Ό ν•˜μ§€λ§Œ 그렇지 μ•Šμ€ 경우 ν˜„μž¬ λ™μž‘μœΌλ‘œ 폴백해야 ν•©λ‹ˆλ‹€.
  • db_col_transaction_abort() λŠ” μ§€κΈˆκ³Ό 같은 λ°©μ‹μœΌλ‘œ μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이것은 μ‹€νŒ¨ν•œ νŠΈλžœμž­μ…˜μ΄ μ„€λ„μš° νŠΈλžœμž­μ…˜μ„ μ§€μš°μ§€λ§Œ(ν•„ν„°λ₯Ό λ³΅μ›ν•˜λ €λ©΄ νŠΈλ¦¬κ°€ ν•„μš”ν•¨) λ‹€μŒμ— μ„±κ³΅ν•œ νŠΈλžœμž­μ…˜μ΄ μ„€λ„μš°λ₯Ό λ³΅μ›ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ‹€νŒ¨ν•œ νŠΈλžœμž­μ…˜μ€ 이것이 μ£Όμš” λ¬Έμ œκ°€ λ˜μ§€ μ•Šμ„ 만큼 μΆ©λΆ„νžˆ λ“œλ¬Όκ²Œ λ°œμƒν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • λ‹€λ₯Έ μž‘μ—…(예: arch/ABI ops?)μ—μ„œ μ„€λ„μš° νŠΈλžœμž­μ…˜μ„ μ§€μ›Œμ•Ό ν•  μˆ˜λ„ μžˆμ§€λ§Œ 확인해야 ν•  μ‚¬ν•­μž…λ‹ˆλ‹€. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  μ„€λ„μš° νŠΈλžœμž­μ…˜μ„ μ§€μš°λŠ” 것은 간단해야 ν•©λ‹ˆλ‹€.
  • 이것은 κ·œμΉ™ μΆ”κ°€ 속도λ₯Ό 높일 뿐만 μ•„λ‹ˆλΌ 일반적으둜 νŠΈλžœμž­μ…˜ 속도λ₯Ό λ†’μ΄λŠ” 이점이 μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ§€κΈˆμ€ μ€‘μš”ν•˜μ§€ μ•Šμ„ 수 μžˆμ§€λ§Œ νŠΈλžœμž­μ…˜ κΈ°λŠ₯을 μ‚¬μš©μžμ—κ²Œ λ…ΈμΆœν•  λ•Œ μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€(BSD "약속"κ³Ό 같은 λ©”μ»€λ‹ˆμ¦˜μ„ μˆ˜ν–‰ν•˜λ €λŠ” 경우 ν•„μš”ν•¨).

였늘 저녁 식사 ν›„ μ‹œκ°„μ΄ μ’€ μžˆμ–΄μ„œ μœ„μ˜ μ„€λ„μš° νŠΈλžœμž­μ…˜ 아이디어λ₯Ό κ΅¬ν˜„ν•˜λŠ” 데 λΉ λ₯΄κ²Œ ν†΅κ³Όν–ˆμŠ΅λ‹ˆλ‹€. μ½”λ“œλŠ” μ—¬μ „νžˆ μ‘°μž‘ν•˜κ³  λ‚΄ ν…ŒμŠ€νŠΈ(μ•„λž˜)λŠ” 더 μ‘°μž‘ν•˜μ§€λ§Œ 이 μ ‘κ·Ό λ°©μ‹μœΌλ‘œ μ•½κ°„μ˜ μ„±λŠ₯ ν–₯상을 보고 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

  • κΈ°μ€€ ν…ŒμŠ€νŠΈ μ˜€λ²„ν—€λ“œ
# time for i in {0..20000}; do /bin/true; done
real    0m10.479s
user    0m7.641s
sys     0m3.924s
  • ν˜„μž¬ λ§ˆμŠ€ν„° 브랜치
# time for i in {0..20000}; do ./42-sim-adv_chains > /dev/null; done

real    0m16.303s
user    0m12.584s
sys     0m4.501s
  • 패치됨
time for i in {0..20000}; do ./42-sim-adv_chains > /dev/null; done

real    0m15.021s
user    0m11.540s
sys     0m4.387s

ν…ŒμŠ€νŠΈ μ˜€λ²„ν—€λ“œλ₯Ό λΉΌλ©΄ 이 "ν…ŒμŠ€νŠΈ"μ—μ„œ μ•½ 20%의 μ„±λŠ₯ ν–₯상을 λ³Ό 수 μžˆμ§€λ§Œ λ³΅μž‘ν•œ ν•„ν„° μ„ΈνŠΈμ˜ 이점이 이보닀 더 λ‚˜μ„ κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€(훨씬 더 λ‚˜μ€κ°€μš”?).

@varqox 및/λ˜λŠ” @crosbymichael 일단 패치λ₯Ό μ•½κ°„ μ •λ¦¬ν•˜κ³  PR을 μž‘μ„±ν•˜λ©΄ κ·€ν•˜μ˜ ν™˜κ²½μ—μ„œ 이것을 ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

λ‚΄ 예제 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” 이미 여기에 μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”,
이 λ¬Έμ œλŠ” v2.3.3κ³Ό v2.4.0 μ‚¬μ΄μ˜ 컀밋 ce3dda9 에 μ˜ν•΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ 예λ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€. foo.c.zip .
그것은 맀우 λ§Žμ€ 수의 κ·œμΉ™μ„ μΆ”κ°€ν•©λ‹ˆλ‹€. 그리고 μœ„μ—μ„œ μ–ΈκΈ‰ν•œ 컀밋 ν›„ μ•½ 100λ°° 느리게 μž‘λ™ν•©λ‹ˆλ‹€.

foo.c v2.4.1을 μ‚¬μš©ν•œ μ‹€ν–‰ μ‹œκ°„: 0.448
foo.c v2.3.3을 μ‚¬μš©ν•œ μ‹€ν–‰ μ‹œκ°„: 0.077

ν•˜μ§€λ§Œ PR이 μ€€λΉ„λ˜λŠ” λŒ€λ‘œ λ‚΄ ν™˜κ²½μ—μ„œ ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@varqox μ•ˆλ…•ν•˜μ„Έμš”. 예, μ›λž˜ λ³΄κ³ μ„œμ— ν…ŒμŠ€νŠΈ 사둀λ₯Ό ν¬ν•¨ν•˜λŠ” 것을 λ³΄μ•˜μ§€λ§Œ μ‹€μ œ μ‚¬μš©μ—μ„œ ν…ŒμŠ€νŠΈ 사둀가 μ–΄λ–»κ²Œ μˆ˜ν–‰λ˜λŠ”μ§€ λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. PR #180을 μ‚¬μš©ν•΄ 보고 λ‹€μ‹œ 보고해 μ£Όμ‹œλ©΄ 정말 κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” @pcmoore ,

이 PR을 λ§Œλ“€μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.
λ‚˜λŠ” λ‹Ήμ‹ μ˜ PR #180을 λ§Œλ“€κ³  ν…ŒμŠ€νŠΈν–ˆκ³  κ²°κ³ΌλŠ” λ‚΄ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ μœ λ§ν•©λ‹ˆλ‹€. 고객이 docker μƒνƒœ 확인을 μ‚¬μš©ν•˜κ³  libseccomp 2.4.x 의 μ„±λŠ₯ 문제λ₯Ό κ²ͺμ—ˆκΈ° λ•Œλ¬Έμ— 이 문제λ₯Ό λ΄…λ‹ˆλ‹€.
λ‚΄ ν…ŒμŠ€νŠΈ μ‚¬λ‘€μ—μ„œ 이 PR의 μ„±λŠ₯은 libseccomp 2.3.3 와 λΉ„μŠ·ν•©λ‹ˆλ‹€. μ„ΈλΆ€ 사항은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

ν™˜κ²½

MacBook Pro(15인치, 2015λ…„ μ€‘λ°˜)의 Ubuntu 19.04 VM(2 CPU, 2G λ©”λͺ¨λ¦¬)
컀널 5.0.0-32-일반
도컀 CE 19.03.2

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€:

20개의 용기 μ€€λΉ„:

for i in $(seq 1 20)
do
  docker run -d --name bb$i busybox sleep 3d
done

λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ™μ‹œμ— docker exec λ₯Ό μ‹€ν–‰ν•˜μ—¬ ν…ŒμŠ€νŠΈ μ‹€ν–‰

for i in $(seq 1 20)
do 
  /usr/bin/time -f "%E real" docker exec bb$i true & 
done

κ²°κ³Ό

libseccomp 2.3.3

0:01.05 real
0:01.12 real
0:01.16 real
0:01.20 real
0:01.23 real
0:01.27 real
0:01.31 real
0:01.35 real
0:01.37 real
0:01.38 real
0:01.40 real
0:01.41 real
0:01.40 real
0:01.40 real
0:01.45 real
0:01.46 real
0:01.47 real
0:01.48 real
0:01.48 real
0:01.49 real

libseccomp 2.4.1

0:00.98 real
0:01.63 real
0:01.67 real
0:01.95 real
0:02.55 real
0:02.70 real
0:02.70 real
0:02.96 real
0:03.04 real
0:03.16 real
0:03.17 real
0:03.21 real
0:03.23 real
0:03.27 real
0:03.24 real
0:03.29 real
0:03.27 real
0:03.29 real
0:03.28 real
0:03.27 real

λ‹Ήμ‹ μ˜ PR λΉŒλ“œ

0:00.95 real
0:01.12 real
0:01.20 real
0:01.23 real
0:01.28 real
0:01.29 real
0:01.31 real
0:01.37 real
0:01.38 real
0:01.40 real
0:01.43 real
0:01.43 real
0:01.44 real
0:01.45 real
0:01.42 real
0:01.47 real
0:01.48 real
0:01.48 real
0:01.48 real
0:01.50 real

기타 λ©”λͺ¨

  • 이 PR을 μž‘μ„±ν•˜κΈ° 전에 AC_INIT in configure.ac 에 $ 2.4.1 λ₯Ό μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  • 이 μ‚¬μš©μž μ •μ˜ λΉŒλ“œλŠ” /usr/local/lib 에 μ„€μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ 쀑에 μ‚¬μš©μž μ •μ˜ λΉŒλ“œκ°€ μ‚¬μš© 쀑인지 ν™•μΈν•˜κΈ° μœ„ν•΄ ldd /usr/bin/runc λ₯Ό μ‹€ν–‰ν•˜μ—¬ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.
  • ν…ŒμŠ€νŠΈλ₯Ό λͺ‡ 번 μ‹€ν–‰ν–ˆλŠ”λ° 결과에 μ•„μ£Ό μž‘μ€ νŽΈμ°¨κ°€ μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” 그것듀이 μš°μ—°ν•œ κ²°κ³Όκ°€ μ•„λ‹ˆλΌκ³  ν™•μ‹ ν•©λ‹ˆλ‹€.

ν›Œλ₯­ν•©λ‹ˆλ‹€. @xinfengliu의 도움에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” @pcmoore ,
이 PR에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.
제 κ²½μš°μ—λŠ” libseccomp μ„±λŠ₯을 v2.3.3에 ν•„μ ν•˜λŠ” μˆ˜μ€€μœΌλ‘œ λ³΅μ›ν•©λ‹ˆλ‹€.

κ²°κ³Ό

foo.c

g++ foo.c -lseccomp -o foo -O3
for ((i=0; i<10; ++i)); do time ./foo; done 

libseccomp 2.3.3

./foo  0.01s user 0.00s system 98% cpu 0.018 total
./foo  0.02s user 0.00s system 98% cpu 0.020 total
./foo  0.02s user 0.00s system 98% cpu 0.019 total
./foo  0.02s user 0.00s system 98% cpu 0.018 total
./foo  0.02s user 0.00s system 98% cpu 0.019 total
./foo  0.02s user 0.00s system 98% cpu 0.019 total
./foo  0.02s user 0.00s system 98% cpu 0.019 total
./foo  0.02s user 0.00s system 98% cpu 0.019 total
./foo  0.02s user 0.00s system 98% cpu 0.018 total
./foo  0.02s user 0.00s system 98% cpu 0.019 total

평균: 0.0188 s

libseccomp 2.4.2

./foo  0.19s user 0.00s system 99% cpu 0.195 total
./foo  0.19s user 0.00s system 99% cpu 0.194 total
./foo  0.19s user 0.00s system 99% cpu 0.193 total
./foo  0.19s user 0.00s system 99% cpu 0.196 total
./foo  0.19s user 0.00s system 99% cpu 0.195 total
./foo  0.20s user 0.00s system 99% cpu 0.196 total
./foo  0.19s user 0.00s system 99% cpu 0.194 total
./foo  0.20s user 0.00s system 99% cpu 0.197 total
./foo  0.19s user 0.00s system 99% cpu 0.195 total
./foo  0.19s user 0.00s system 99% cpu 0.194 total

평균: 0.1949 s

홍보 #180

./foo  0.01s user 0.01s system 98% cpu 0.012 total
./foo  0.01s user 0.00s system 97% cpu 0.013 total
./foo  0.01s user 0.00s system 96% cpu 0.013 total
./foo  0.01s user 0.01s system 97% cpu 0.014 total
./foo  0.01s user 0.00s system 97% cpu 0.012 total
./foo  0.01s user 0.00s system 98% cpu 0.013 total
./foo  0.01s user 0.00s system 98% cpu 0.012 total
./foo  0.01s user 0.00s system 98% cpu 0.013 total
./foo  0.01s user 0.00s system 97% cpu 0.013 total
./foo  0.01s user 0.00s system 97% cpu 0.011 total

평균: 0.0126 s

이 PR은 이 ν•©μ„± ν…ŒμŠ€νŠΈμ—μ„œ v2.3.3보닀 μ•½κ°„μ˜ 속도 ν–₯상을 μ œκ³΅ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚΄ μƒŒλ“œλ°•μŠ€μ—μ„œ ν•„ν„° λΉŒλ“œ 및 λ‘œλ“œ(seccomp_init()μ—μ„œ seccomp_load()둜) 및 일뢀 μƒŒλ“œλ°•μŠ€ μ΄ˆκΈ°ν™” μ˜€λ²„ν—€λ“œ

libseccomp 2.3.3

Measured: 0.0052 s
Measured: 0.0040 s
Measured: 0.0046 s
Measured: 0.0042 s
Measured: 0.0038 s
Measured: 0.0038 s
Measured: 0.0039 s
Measured: 0.0036 s
Measured: 0.0042 s
Measured: 0.0044 s
Measured: 0.0036 s
Measured: 0.0037 s
Measured: 0.0044 s
Measured: 0.0035 s
Measured: 0.0035 s
Measured: 0.0035 s
Measured: 0.0040 s
Measured: 0.0037 s
Measured: 0.0043 s
Measured: 0.0042 s
Measured: 0.0035 s
Measured: 0.0034 s
Measured: 0.0038 s
Measured: 0.0035 s
Measured: 0.0035 s
Measured: 0.0037 s
Measured: 0.0038 s

평균: 0.0039 s

libseccomp 2.4.2

Measured: 0.0496 s
Measured: 0.0480 s
Measured: 0.0474 s
Measured: 0.0475 s
Measured: 0.0479 s
Measured: 0.0479 s
Measured: 0.0492 s
Measured: 0.0485 s
Measured: 0.0491 s
Measured: 0.0490 s
Measured: 0.0484 s
Measured: 0.0483 s
Measured: 0.0480 s
Measured: 0.0482 s
Measured: 0.0474 s
Measured: 0.0483 s
Measured: 0.0507 s
Measured: 0.0472 s
Measured: 0.0482 s
Measured: 0.0471 s
Measured: 0.0498 s
Measured: 0.0489 s
Measured: 0.0474 s
Measured: 0.0494 s
Measured: 0.0483 s
Measured: 0.0498 s
Measured: 0.0492 s

평균: 0.0466 s

홍보 #180

Measured: 0.0058 s
Measured: 0.0059 s
Measured: 0.0054 s
Measured: 0.0046 s
Measured: 0.0059 s
Measured: 0.0048 s
Measured: 0.0045 s
Measured: 0.0051 s
Measured: 0.0052 s
Measured: 0.0053 s
Measured: 0.0048 s
Measured: 0.0048 s
Measured: 0.0045 s
Measured: 0.0044 s
Measured: 0.0044 s
Measured: 0.0059 s
Measured: 0.0044 s
Measured: 0.0046 s
Measured: 0.0046 s
Measured: 0.0044 s
Measured: 0.0044 s
Measured: 0.0062 s
Measured: 0.0047 s
Measured: 0.0044 s
Measured: 0.0044 s
Measured: 0.0044 s
Measured: 0.0044 s

평균: 0.0049 s

ν•©μ„± ν…ŒμŠ€νŠΈμ—μ„œ PR은 v2.3.3보닀 더 λ‚˜μ€ μ‹œκ°„μ„ μ œκ³΅ν•˜μ§€λ§Œ μ‹€μ œ μ„Έκ³„μ—μ„œλŠ” μ•½κ°„ λŠλ¦½λ‹ˆλ‹€(더 λ³΅μž‘ν•œ κ·œμΉ™κ³Ό 두 개의 큰 ν•„ν„°λ₯Ό λ³‘ν•©ν•˜κΈ° μœ„ν•΄ seccomp_merge()λ₯Ό μ‹€ν–‰ν•˜κΈ° λ•Œλ¬ΈμΌ 수 있음). κ·ΈλŸ¬λ‚˜ μ—¬μ „νžˆ v2.4.2에 λΉ„ν•΄ λŒ€λž΅ 10배의 속도 ν–₯상을 μ œκ³΅ν•©λ‹ˆλ‹€.

@varqox μ„±λŠ₯을 확인해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! @drakenclimber κ°€ λ§ˆμ§€λ§‰ λŒ“κΈ€μ— μ‘λ‹΅ν•˜λŠ” μ¦‰μ‹œ(그리고 κ·Έκ°€ μ œκΈ°ν•  수 μžˆλŠ” λ‚˜λ¨Έμ§€ 문제λ₯Ό μˆ˜μ •ν•¨) 이λ₯Ό 병합할 κ²ƒμž…λ‹ˆλ‹€.

μ•„, μ‹ κ²½ 쓰지 λ§ˆμ„Έμš”. @drakenclimber κ°€ PR을 승인된 κ²ƒμœΌλ‘œ ν‘œμ‹œν•œ 것을 방금 μ•Œμ•„μ°¨λ ΈμŠ΅λ‹ˆλ‹€. 이제 λ³‘ν•©ν•˜μ—¬ μ§„ν–‰ν•˜κ² μŠ΅λ‹ˆλ‹€.

방금 PR #180을 λ³‘ν•©ν•˜μ—¬ 이 μž‘μ—…μ„ μ’…λ£Œλ‘œ ν‘œμ‹œν•  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 남은 μ„±λŠ₯ 문제λ₯Ό λ°œκ²¬ν•œ μ‚¬λžŒμ΄ 있으면 μ–Έμ œλ“ μ§€ λŒ“κΈ€μ„ λ‹¬κ±°λ‚˜ λ‹€μ‹œ μ—¬μ‹­μ‹œμ˜€. 인내심과 도움을 μ£Όμ‹  λͺ¨λ“  λΆ„λ“€κ»˜ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

@pcmoore μ΄λŸ¬ν•œ λ³€κ²½ 사항과 ν•¨κ»˜ 곧 μΆœμ‹œν•  κ³„νšμž…λ‹ˆκΉŒ?

이것은 ν˜„μž¬ libseccomp v2.5 릴리슀 μ΄μ •ν‘œμ˜ 일뢀이며 μ•„λž˜ 링크λ₯Ό μ‚¬μš©ν•˜μ—¬ v2.5 λ¦΄λ¦¬μŠ€μ— λŒ€ν•œ 진행 상황을 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€.

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