Почему ioctl с SIOCGIFCONF иногда выполняется медленно? ⇐ JAVA
-
Anonymous
Почему ioctl с SIOCGIFCONF иногда выполняется медленно?
Когда я использовал JDK8 в Linux, я обнаружил, что метод java.net.NetworkInterface#getNetworkInterfaces иногда требует несколько секунд для возврата, поэтому я написал следующую программу на Java, чтобы попытаться воспроизвести проблему:
import java.net.NetworkInterface; импортировать java.net.SocketException; импортировать java.time.LocalDateTime; импортировать java.time.format.DateTimeFormatter; общественный класс NetworkTest { частный статический окончательный DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("гггг-ММ-дд ЧЧ:мм:сс.ССС"); public static void main(String[] args) { в то время как (истина) { пытаться { длинный startTime = System.currentTimeMillis(); NetworkInterface.getNetworkInterfaces(); long endTime = System.currentTimeMillis(); длинная стоимость = endTime - startTime; если (стоимость > 200) { System.out.println("время: " + LocalDateTime.now().format(DATE_TIME_FORMATTER) + ", стоимость: " + стоимость + "мс"); } } catch (SocketException e) { выдать новое RuntimeException(e); } пытаться { Thread.sleep(1000); } catch (InterruptedException e) { выдать новое RuntimeException(e); } } } } В то же время я использовал strace для отслеживания программы и обнаружил, что ioctl с SIOCGIFCONF иногда выполняется медленно. Ниже приведен записанный журнал, который занял много времени.
Вывод Java:
время: 26 декабря 2023 г., 20:51:22.453, стоимость: 1971 мс. Вывод strace:
20:51:20.482408 сокет(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 8 20:51:20.482448 ioctl(8, SIOCGIFCONF, {1000 -> 80, NULL}) = 0 20:51:21.450974 ioctl(8, SIOCGIFCONF, {80, {{"lo", {AF_INET, inet_addr("127.0.0.1")}}, {"eth0", {AF_INET, inet_addr("10.0.16.15") }}}}) = 0 20:51:22.452894 ioctl(8, SIOCGIFFLAGS, {ifr_name="lo", ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0 20:51:22.452960 ioctl(8, SIOCGIFNETMASK, {ifr_name="lo", ifr_netmask={AF_INET, inet_addr("255.0.0.0")}}) = 0 20:51:22.453023 ioctl(8, SIOCGIFINDEX, {ifr_name="lo", ifr_index=1}) = 0 20:51:22.453060 ioctl(8, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0 20:51:22.453093 ioctl(8, SIOCGIFBRDADDR, {ifr_name="eth0", ifr_broadaddr={AF_INET, inet_addr("10.0.16.15")}}) = 0 20:51:22.453127 ioctl(8, SIOCGIFNETMASK, {ifr_name="eth0", ifr_netmask={AF_INET, inet_addr("255.255.255.255")}}) = 0 20:51:22.453161 ioctl(8, SIOCGIFINDEX, {ifr_name="eth0", ifr_index=128}) = 0 20:51:22.453199 закрыть(8) = 0 20:51:22.453242 сокет (PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 8 20:51:22.453297 open("/proc/net/if_inet6", O_RDONLY) = 9 20:51:22.453360 fstat(9, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 20:51:22.453410 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7cd648e000 20:51:22.453448 read(9, "fe80000000000000b8cef600741e59e0"..., 1024) = 108 20:51:22.453517 чтение(9, "", 1024) = 0 20:51:22.453552 чтение(9, "", 1024) = 0 20:51:22.453590 закрыть(9) = 0 20:51:22.453646 munmap(0x7f7cd648e000, 4096) = 0 20:51:22.453684 закрыть(8) = 0 20:51:22.453991 write(1, "время: 2023-12-26 20:51:22.453, c"..., 41) = 41 20:51:22.454055 write(1, "\n", 1) = 1 Из приведенного выше вывода мы видим, что ioctl с SIOCGIFCONF дважды занимает много времени. Какова возможная причина? Как я могу продолжить устранение причины?
Ссылка: java.net.NetworkInterface#getAll
Обновить
Я пытался использовать ftrace и systemtap для дальнейшего устранения неполадок, но поскольку моя система Linux настроена компанией, вышеуказанные инструменты не действуют (отсутствие соответствующей информации об отладке). Есть ли другие идеи по устранению неполадок?
Если я запускаю описанный выше NetworkTest в течение длительного времени, я могу наблюдать, что медленные запросы происходят с интервалом в полчаса, но я не знаю причину.
время: 03.01.2024 11:51:20.459, стоимость: 769 мс время: 03.01.2024 11:51:22.458, стоимость: 999мс время: 03.01.2024 12:21:21.451, стоимость: 550мс время: 03.01.2024 12:51:21.453, стоимость: 558мс время: 03.01.2024 13:06:20.456, стоимость: 780мс время: 03.01.2024 13:06:23.453, стоимость: 1995мс время: 03.01.2024 13:21:19.459, стоимость: 786мс время: 03.01.2024 13:21:21.453, стоимость: 994мс время: 03.01.2024 13:36:20.452, стоимость: 777мс время: 03.01.2024 13:51:20.457, стоимость: 777мс время: 03.01.2024 13:51:23.459, стоимость: 1002мс время: 03.01.2024 14:06:20.458, стоимость: 775мс время: 03.01.2024 14:06:22.458, стоимость: 1000мс время: 03.01.2024 14:21:19.450, стоимость: 755мс время: 03.01.2024 14:21:22.453, стоимость: 1002мс время: 03.01.2024 14:36:20.451, стоимость: 777мс время: 03.01.2024, 14:51:22.452, стоимость: 1754 мс. время: 03.01.2024 14:51:24.458, стоимость: 1006мс время: 03.01.2024 15:06:21.454, стоимость: 1743мс время: 03.01.2024 15:06:23.458, стоимость: 1004 мс время: 03.01.2024 15:21:21.456, стоимость: 728мс время: 03.01.2024 15:21:23.458, стоимость: 1001мс время: 03.01.2024 15:36:21.458, стоимость: 727мс время: 03.01.2024 15:36:25.453, стоимость: 1994 мс время: 03.01.2024 15:51:22.460, стоимость: 732мс время: 03.01.2024 15:51:25.452, стоимость: 1992мс время: 03.01.2024 16:06:21.455, стоимость: 733мс время: 03.01.2024 16:06:23.456, стоимость: 1001мс время: 03.01.2024 16:21:22.454, стоимость: 727мс время: 03.01.2024 16:36:21.458, стоимость: 735мс время: 03.01.2024, 16:36:24.451, стоимость: 1993 мс. время: 03.01.2024 16:51:22.455, стоимость: 732мс время: 03.01.2024 17:06:21.453, стоимость: 726мс время: 03.01.2024 17:06:23.458, стоимость: 1005мс время: 03.01.2024 17:21:21.455, стоимость: 726мс время: 03.01.2024 17:36:20.458, стоимость: 732мс время: 03.01.2024 17:36:22.457, стоимость: 999мс время: 03.01.2024 17:51:21.456, стоимость: 730мс время: 03.01.2024 18:06:21.451, стоимость: 724 мс время: 03.01.2024 18:21:21.457, стоимость: 731мс время: 03.01.2024 18:36:20.457, стоимость: 725мс время: 03.01.2024 18:36:23.455, стоимость: 1997мс время: 03.01.2024 18:51:22.458, стоимость: 733мс время: 03.01.2024 18:51:25.453, стоимость: 1994мс время: 03.01.2024 19:06:23.451, стоимость: 1720мс время: 03.01.2024 19:21:21.459, стоимость: 728мс время: 03.01.2024 19:21:23.458, стоимость: 999мс время: 03.01.2024 19:36:21.458, стоимость: 729мс время: 03.01.2024, 19:36:24.454, стоимость: 1995 мс. время: 03.01.2024 19:51:23.451, стоимость: 1727мс время: 03.01.2024 19:51:26.454, стоимость: 1002мс время: 03.01.2024 20:06:23.455, стоимость: 729мс время: 03.01.2024 20:21:22.453, стоимость: 1727мс время: 03.01.2024 20:21:24.460, стоимость: 1006мс Версия ядра: 4.18.0-193.el8.#{company}.x86_64
Когда я использовал JDK8 в Linux, я обнаружил, что метод java.net.NetworkInterface#getNetworkInterfaces иногда требует несколько секунд для возврата, поэтому я написал следующую программу на Java, чтобы попытаться воспроизвести проблему:
import java.net.NetworkInterface; импортировать java.net.SocketException; импортировать java.time.LocalDateTime; импортировать java.time.format.DateTimeFormatter; общественный класс NetworkTest { частный статический окончательный DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("гггг-ММ-дд ЧЧ:мм:сс.ССС"); public static void main(String[] args) { в то время как (истина) { пытаться { длинный startTime = System.currentTimeMillis(); NetworkInterface.getNetworkInterfaces(); long endTime = System.currentTimeMillis(); длинная стоимость = endTime - startTime; если (стоимость > 200) { System.out.println("время: " + LocalDateTime.now().format(DATE_TIME_FORMATTER) + ", стоимость: " + стоимость + "мс"); } } catch (SocketException e) { выдать новое RuntimeException(e); } пытаться { Thread.sleep(1000); } catch (InterruptedException e) { выдать новое RuntimeException(e); } } } } В то же время я использовал strace для отслеживания программы и обнаружил, что ioctl с SIOCGIFCONF иногда выполняется медленно. Ниже приведен записанный журнал, который занял много времени.
Вывод Java:
время: 26 декабря 2023 г., 20:51:22.453, стоимость: 1971 мс. Вывод strace:
20:51:20.482408 сокет(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 8 20:51:20.482448 ioctl(8, SIOCGIFCONF, {1000 -> 80, NULL}) = 0 20:51:21.450974 ioctl(8, SIOCGIFCONF, {80, {{"lo", {AF_INET, inet_addr("127.0.0.1")}}, {"eth0", {AF_INET, inet_addr("10.0.16.15") }}}}) = 0 20:51:22.452894 ioctl(8, SIOCGIFFLAGS, {ifr_name="lo", ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0 20:51:22.452960 ioctl(8, SIOCGIFNETMASK, {ifr_name="lo", ifr_netmask={AF_INET, inet_addr("255.0.0.0")}}) = 0 20:51:22.453023 ioctl(8, SIOCGIFINDEX, {ifr_name="lo", ifr_index=1}) = 0 20:51:22.453060 ioctl(8, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0 20:51:22.453093 ioctl(8, SIOCGIFBRDADDR, {ifr_name="eth0", ifr_broadaddr={AF_INET, inet_addr("10.0.16.15")}}) = 0 20:51:22.453127 ioctl(8, SIOCGIFNETMASK, {ifr_name="eth0", ifr_netmask={AF_INET, inet_addr("255.255.255.255")}}) = 0 20:51:22.453161 ioctl(8, SIOCGIFINDEX, {ifr_name="eth0", ifr_index=128}) = 0 20:51:22.453199 закрыть(8) = 0 20:51:22.453242 сокет (PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 8 20:51:22.453297 open("/proc/net/if_inet6", O_RDONLY) = 9 20:51:22.453360 fstat(9, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 20:51:22.453410 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7cd648e000 20:51:22.453448 read(9, "fe80000000000000b8cef600741e59e0"..., 1024) = 108 20:51:22.453517 чтение(9, "", 1024) = 0 20:51:22.453552 чтение(9, "", 1024) = 0 20:51:22.453590 закрыть(9) = 0 20:51:22.453646 munmap(0x7f7cd648e000, 4096) = 0 20:51:22.453684 закрыть(8) = 0 20:51:22.453991 write(1, "время: 2023-12-26 20:51:22.453, c"..., 41) = 41 20:51:22.454055 write(1, "\n", 1) = 1 Из приведенного выше вывода мы видим, что ioctl с SIOCGIFCONF дважды занимает много времени. Какова возможная причина? Как я могу продолжить устранение причины?
Ссылка: java.net.NetworkInterface#getAll
Обновить
Я пытался использовать ftrace и systemtap для дальнейшего устранения неполадок, но поскольку моя система Linux настроена компанией, вышеуказанные инструменты не действуют (отсутствие соответствующей информации об отладке). Есть ли другие идеи по устранению неполадок?
Если я запускаю описанный выше NetworkTest в течение длительного времени, я могу наблюдать, что медленные запросы происходят с интервалом в полчаса, но я не знаю причину.
время: 03.01.2024 11:51:20.459, стоимость: 769 мс время: 03.01.2024 11:51:22.458, стоимость: 999мс время: 03.01.2024 12:21:21.451, стоимость: 550мс время: 03.01.2024 12:51:21.453, стоимость: 558мс время: 03.01.2024 13:06:20.456, стоимость: 780мс время: 03.01.2024 13:06:23.453, стоимость: 1995мс время: 03.01.2024 13:21:19.459, стоимость: 786мс время: 03.01.2024 13:21:21.453, стоимость: 994мс время: 03.01.2024 13:36:20.452, стоимость: 777мс время: 03.01.2024 13:51:20.457, стоимость: 777мс время: 03.01.2024 13:51:23.459, стоимость: 1002мс время: 03.01.2024 14:06:20.458, стоимость: 775мс время: 03.01.2024 14:06:22.458, стоимость: 1000мс время: 03.01.2024 14:21:19.450, стоимость: 755мс время: 03.01.2024 14:21:22.453, стоимость: 1002мс время: 03.01.2024 14:36:20.451, стоимость: 777мс время: 03.01.2024, 14:51:22.452, стоимость: 1754 мс. время: 03.01.2024 14:51:24.458, стоимость: 1006мс время: 03.01.2024 15:06:21.454, стоимость: 1743мс время: 03.01.2024 15:06:23.458, стоимость: 1004 мс время: 03.01.2024 15:21:21.456, стоимость: 728мс время: 03.01.2024 15:21:23.458, стоимость: 1001мс время: 03.01.2024 15:36:21.458, стоимость: 727мс время: 03.01.2024 15:36:25.453, стоимость: 1994 мс время: 03.01.2024 15:51:22.460, стоимость: 732мс время: 03.01.2024 15:51:25.452, стоимость: 1992мс время: 03.01.2024 16:06:21.455, стоимость: 733мс время: 03.01.2024 16:06:23.456, стоимость: 1001мс время: 03.01.2024 16:21:22.454, стоимость: 727мс время: 03.01.2024 16:36:21.458, стоимость: 735мс время: 03.01.2024, 16:36:24.451, стоимость: 1993 мс. время: 03.01.2024 16:51:22.455, стоимость: 732мс время: 03.01.2024 17:06:21.453, стоимость: 726мс время: 03.01.2024 17:06:23.458, стоимость: 1005мс время: 03.01.2024 17:21:21.455, стоимость: 726мс время: 03.01.2024 17:36:20.458, стоимость: 732мс время: 03.01.2024 17:36:22.457, стоимость: 999мс время: 03.01.2024 17:51:21.456, стоимость: 730мс время: 03.01.2024 18:06:21.451, стоимость: 724 мс время: 03.01.2024 18:21:21.457, стоимость: 731мс время: 03.01.2024 18:36:20.457, стоимость: 725мс время: 03.01.2024 18:36:23.455, стоимость: 1997мс время: 03.01.2024 18:51:22.458, стоимость: 733мс время: 03.01.2024 18:51:25.453, стоимость: 1994мс время: 03.01.2024 19:06:23.451, стоимость: 1720мс время: 03.01.2024 19:21:21.459, стоимость: 728мс время: 03.01.2024 19:21:23.458, стоимость: 999мс время: 03.01.2024 19:36:21.458, стоимость: 729мс время: 03.01.2024, 19:36:24.454, стоимость: 1995 мс. время: 03.01.2024 19:51:23.451, стоимость: 1727мс время: 03.01.2024 19:51:26.454, стоимость: 1002мс время: 03.01.2024 20:06:23.455, стоимость: 729мс время: 03.01.2024 20:21:22.453, стоимость: 1727мс время: 03.01.2024 20:21:24.460, стоимость: 1006мс Версия ядра: 4.18.0-193.el8.#{company}.x86_64
Мобильная версия