첨부 문서(원본 소실에 대비해 첨부)는 오래 걸리는 nif function call에 관해 심도있게 고찰한 문서이다.
간단히 요약한다.
0. 전제
NIF의 제약 사항은 아주 빨리 처리를 끝내야한다는 것이다 (보통 1~2 ms)
이유는 native code를 처리할 때는 ERTS의 scheduler가 block되므로 다종다양한, 파악조차 힘든 문제를 겪을 수 있다.
(대표적으로 여러 노드가 통신하는 상황이면 60초 timeout에 걸릴 수 있는데, 처음 경험하면 아주 난감한 상황이 될 것이다)
참고로 function call의 처리가 끝나는 시점은 return value를 받는 시점이다.
1. chunking
말 그대로 조금씩 잘라서 처리하는 것이다.
2. enif_schedule_nif (+ enif_consume_timeslice)
chunking을 좀더 편하게 해주는 API가 추가된 것이다.
3. dirty schedulers:
task의 성격에 따라 schedule 정책을 달리하는(?) 것이다.
기본적으로 ERTS에 포함되지 않았으므로 이렇게 ERTS compile:
configure --enable-dirty-schedulers
사용:
ErlNifFunc 정의에서 ERL_NIF_DIRTY_JOB_CPU_BOUND, ERL_NIF_DIRTY_JOB_IO_BOUND 등의 flag를 준다.
4. thread 사용(어디서 읽었는데 이 문서는 아닌듯)
nif function은 caller pid 정도만 저장하고 바로 return한다.
worker thread가 오래 걸리는 작업을 처리한 후에 enif_send로 caller process에 전달한다. caller process는 receive해서 결과를 받는다.
14115736879341vinoskioptnativecode.pdf
원본: http://www.erlang-factory.com/static/upload/media/14115736879341vinoskioptnativecode.pdf
happy hackin'