[erlang-questions] How to debug dirty NIF?

Max Lapshin <>
Thu Aug 28 17:19:24 CEST 2014


I'm running CPU bound task (make thumbnails from video) in a NIF under
 erlang 17 (erts 6.0)

I'm using dirty nif scheduling:

static ERL_NIF_TERM
yuv2jpeg0(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
....
}


static ERL_NIF_TERM
async_jpeg(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
  ERL_NIF_TERM result = yuv2jpeg0(env, argc, argv);
  return enif_schedule_dirty_nif_finalizer(env, result,
enif_dirty_nif_finalizer);
}


static ERL_NIF_TERM
yuv2jpeg(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
  return enif_schedule_dirty_nif(env, ERL_NIF_DIRTY_JOB_CPU_BOUND,
async_jpeg, argc, argv);
}

I see strange situation: none of CPU core is not 100% loaded, but processes
that are calling yuv2jpeg function are hanging in this function:


()3> process_info(pid(0,961,0)).

[{current_function,{avcodec,yuv2jpeg0,4}},

 {initial_call,{proc_lib,init_p,5}},

 {status,runnable},

 {message_queue_len,11},

 {messages,[{jpeg,[{video_frame,video,37885047.833333336,

                                37885047.833333336,0,h264,keyframe,1,

                                <<0,0,0,2,9,240,0,0,21,...>>,


I suppose that I could meet the old problem with wrong scheduler behaviour
when NIF is using thread for too long.

yuv2jpeg takes usually about 2-4 milliseconds to run.

Is it possible to debug this situation? Can I somehow ask erlang if it
decided that some scheduler is considered idle?

I launch erlang so:

erlang/erts-6.0/bin/beam.smp -K true -Bi -A 100 -a 32 -stbt s -MBas
aoffcaobf -MBacul 0
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20140828/a89d21a7/attachment.html>


More information about the erlang-questions mailing list