Computer Engineering/My Stack Overflow

Airflow Error - Triggerer's async thread was blocked for xx seconds, likely by a badly-written

jordan.bae 2023. 3. 16. 22:15

Airlfow Logo

이슈 정리

Sentry에서 Trigger에 Triggerer's async thread was blocked for xx seconds, likely by a badly-written .. 하는 에러가 Sentry를 통해 많이 발생한 것을 확인.

 

이슈가 발생한 코드

async def block_watchdog(self):
        """
        Watchdog loop that detects blocking (badly-written) triggers.

        Triggers should be well-behaved async coroutines and await whenever
        they need to wait; this loop tries to run every 100ms to see if
        there are badly-written triggers taking longer than that and blocking
        the event loop.

        Unfortunately, we can't tell what trigger is blocking things, but
        we can at least detect the top-level problem.
        """
        while not self.stop:
            last_run = time.monotonic()
            await asyncio.sleep(0.1)
            # We allow a generous amount of buffer room for now, since it might
            # be a busy event loop.
            time_elapsed = time.monotonic() - last_run
            if time_elapsed > 0.2:
                self.log.error(
                    "Triggerer's async thread was blocked for %.2f seconds, "
                    "likely by a badly-written trigger. Set PYTHONASYNCIODEBUG=1 "
                    "to get more information on overrunning coroutines.",
                    time_elapsed,
                )
                Stats.incr('triggers.blocked_main_thread')

 

이 함수는 무한 루프를 실행하면서 이벤트 루프가 차단되지 않도록 매 0.1초마다 실행을 확인.

이벤트 루프에서 0.1초 await후에 다시 해당 task로 돌아왔을 때 0.2초이상이 걸렸다면 실행에 지연이 있다고 생각하고 error를 기록한다. 즉, 트리거의 이벤트 루프에 병목이 있다고 가정한다.


해결책

kubernetes상 리소스가 많이 부족한 상황은 아니었는데도 발생해서 처음에 이해할 수 없었는데, stackoverflow에서 주로 memory 이슈라는 얘기가 많아서 trigger의 request resource를 1536MiB로 늘렸더니 거의 발생하지 않았다. (일 10회 정도)

반응형