![다른 사용자 공간 프로세스로 인한 pselect 지연](https://linux55.com/image/225193/%EB%8B%A4%EB%A5%B8%20%EC%82%AC%EC%9A%A9%EC%9E%90%20%EA%B3%B5%EA%B0%84%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A1%9C%20%EC%9D%B8%ED%95%9C%20pselect%20%EC%A7%80%EC%97%B0.png)
나는 다음을 가지고 있습니다전제리눅스의 경우:
- 직렬 장치에서 pselect를 사용하여 직렬 데이터를 읽는 프로세스를 사용하고 있습니다
/dev/ttySX
. - 데이터는 400Hz의 안정적인 주파수로 입력됩니다.
- 이 프로세스의 대기 시간을 최적화하기 위해 몇 가지 조치를 사용했습니다.
- 읽기 스레드는 선호도를 사용하여 하나의 코어에 고정되어 있으며 해당 코어에서는 어떤 작업도 실행할 수 없습니다. 이는 cgroups/cpuset을 통해 수행됩니다.
- 읽기 스레드의 RT prio는 SCHED_FIFO 정책을 사용하여 49(IRQ 프로세스 바로 아래)입니다.
- 해당 IRQ는
/dev/ttyS4
동일한 코어에 고정됩니다. IRQ 프로세스도 이 코어에서 실행됩니다. 이는 대기 시간을 더욱 줄이기 위해 수행됩니다.
- 시스템은
stress --cpu XX --io XX
판독값에 영향을 미치는 지연 없이 완전히 로드되었으며 판독값은 400Hz에서 잘 수행됩니다.
이것질문내 경험:
- 많은 리소스를 사용하는 또 다른 문제가 있는 사용자 공간 프로세스가 있습니다. 이것이 실행되면 직렬 읽기 스레드에 엄청난 대기 시간 스파이크가 발생할 수 있습니다. 하드웨어에서 직렬 데이터 도착 시간이 2.5밀리초라고 해도 100밀리초 이상이 될 수 있습니다.
- 나는 일반적인 "좋은" 스케줄러를 사용하고 많은 스레드를 생성한다는 점을 제외하면 문제의 다른 사용자 공간 프로세스에 대해 많이 알지 못합니다.
내 거질문:
- 이것을 디버깅할 수 있는 아이디어나 방법이 있나요? ftrace를 사용할 수도 있지만 어디서부터 시작해야 할지 잘 모르겠습니다.
- 이 동작의 원인이 무엇인지 아시나요?
이 시점에서 나는 어떤 팁/아이디어라도 기꺼이 받을 것입니다. 감사합니다!