[Оружие, которым должен овладеть SRE] strace в Linux: системные вызовы, глубоко проникающие в процесс
[Оружие, которым должен овладеть SRE] strace в Linux: системные вызовы, глубоко проникающие в процесс

    В системе Linux взаимодействие процесса и оборудования осуществляется не напрямую, а через системный вызовосознать。straceэто мощный инструмент,Он может отслеживать системный вызов, когда процесс выполняется и получен сигнал.,Это полезно для диагностики и отладки программ.

Введение и принципы strace

straceИспользуется для отслеживания выполнения программысистемный вызов и Сигнал. В Linux процессы пользовательского режима должны проходить системный вызов для запроса служб состояния ядра,Например, файловые операции、сетевая связьждать。straceВозможность фиксировать детали этих звонков,Включает имя, параметры и возвращаемое значение вызова.,и время, потраченное на выполнение этих вызовов.

Краткое введение в системные вызовы и сигналы

системный вызов

системный вызов(System Call) — это интерфейс программ пользовательского пространства для взаимодействия с пространством ядра операционной системы. Из соображений безопасности и эффективности программы пользовательского пространства не могут напрямую обращаться к ресурсам пространства ядра, а через системный доступ. вызов для запроса ядра на предоставление услуг. системный Существует много типов вызовов,Охватывает файловые операции, управление процессом、сетевая связь、Сигнал регулирует многие другие аспекты.

Принцип реализации системного вызова
  1. Переключение из режима пользователя в режим ядра:Когда необходимо выполнить пользовательскую программусистемный вызов переключится из режима пользователя в режим ядра. Это переключение обычно реализуется посредством механизма прерываний или исключений.
  2. системный вызовповерхность:LinuxЯдро поддерживаетсистемный таблица вызовов, содержащая все доступные системные вызовточка входа。когдасистемный При возникновении вызова соответствующая функция ядра будет найдена и выполнена на основе номера вызова.
  3. Передача параметров:системный вызовизпараметрпроходитьCPUиззарегистрироватьсяиликучапередачав ядро。
  4. осуществлятьсистемный вызов:Функции ядра будутосуществлятьдействительныйиздействовать,Например, чтение и запись файлов, создание процессов и т. д.
  5. Вернуться в пользовательский режим:системный вызов После завершения,Результат будет возвращен в пользовательскую программу.,И переключитесь из режима ядра обратно в пользовательский режим.
системный вызовизпример
Язык кода:javascript
копировать
open(): открыть файл. read(): прочитать данные из файла. write(): запись данных в файл. fork(): копировать процесс.
Сигнал

Сигнал (Signal) — программное прерывание.,Используется для уведомления процесса о произошедших определенных событиях. Сигнал может передавать информацию между пространством пользователя и пространством ядра.,Это простая форма межпроцессного взаимодействия (IPC).

Принцип реализации Сигнала
  1. Сигналпроизводить:когдакогда происходит определенное событие(Если пользователь нажимаетCtrl+C),Ядро сгенерирует Сигнал.
  2. Сигналпередача:Ядро будет Сигнал Отправлено в целевой процесс。
  3. Сигналиметь дело с:Процессы могут быть определены Сигналиметь дело сфункция ответа Сигнал,выполнить определенное действие,Например, игнорирование Сигнала, завершение процесса или выполнение специального кода очистки.
  4. Сигналщит:Этот процесс можетщит(Игнорировать пока)некоторый Сигнал,Чтобы не прерываться в критические моменты.
Примеры сигналов
Язык кода:javascript
копировать
SIGINT: Прерывание отправлено пользователем Сигнал,Обычно используется для завершения приоритетных процессов. SIGKILL: Немедленно завершить процесс.,Его невозможно игнорировать или поймать. SIGTERM: Прервать сигнал,Может быть захвачен процессом и выполнить работу по очистке.
системный вызови Сигнализассоциация

Системный вызов и Сигнал — это механизмы взаимодействия процессов с ядром, но они служат разным целям:

  • системный вызовБольше для процессов, которым требуются услуги ядраизсцена,Например, управление ресурсами, доступ к оборудованию и т. д.
  • Сигналиспользуется между процессамиизуведомитьипростое общение,и урегулирование определенных чрезвычайных ситуаций.

Установка и базовое использование

В большинстве дистрибутивов Linux,straceМожетпроходить Менеджер пакетов для легкой установки。Например,В системах на базе Debian, таких как Ubuntu,Его можно установить с помощью следующей команды:

Язык кода:javascript
копировать
sudo apt-get install strace

Основное использование заключается в следующем:

Язык кода:javascript
копировать
strace <command>

Это выведет<command>осуществлятьв процессеизвсесистемный вызов。

Выходной анализ strace

    straceиз Вывод каждой строкиповерхностьодинсистемный вызов,Включая имя системного вызова, параметры, возвращаемое значение и код ошибки.,Формат обычно следующий:

Язык кода:javascript
копировать
<syscall>(<arguments...>) = <return value>
  • <syscall>дасистемный Имя вызова.
  • <arguments...>дапередача Даватьсистемный вызовизпараметр Списокповерхность。
  • <return value>дасистемный вызовизвозвращаемое значение,В случае успеха обычно0,По ошибке это-1,и установим глобальные переменныеerrno

Пример:

Язык кода:javascript
копировать
open("/etc/passwd", O_RDONLY)          = 3read(3, "root:x:0:0:root:/root:/bin/bash\nbin:x:1:1::/"..., 8192) = 8192close(3)                          = 0

open() Функция пытается открыть файл,read() Чтение данных из файла во время close() Затем закройте дескриптор файла.

Общие параметры strace

straceПредоставляет разнообразныепараметрнастроить отслеживаниеиз Поведение:

Язык кода:javascript
копировать
-c: подсчитать каждый системный время выполнения вызова, количество раз и количество ошибок. -T: Отобразить каждый системный оцените потраченное время. -е трассировка=set: отслеживать только указанную систему набор вызовов, например -e трассировка = открыть, закрыть. -f: отслеживать дочерние процессы, созданные fork(). -о <file>:Перенаправить вывод в файл。-p <pid>:Отслеживание заданийизпроцессID。

Отслеживайте конкретный процесс

Если вы хотите отслеживать уже запущенный процесс,Можно использовать-pпараметр Укажите процессID:

Язык кода:javascript
копировать
strace -p <pid>

Процесс позиционирования завершился ненормально

Отслеживая системный вызов процесса, вы можете наблюдать последнее поведение процесса перед ненормальным завершением:

Язык кода:javascript
копировать
strace -p <pid> -o output.txt

Обнаружение исключений общей памяти

системный, связанный с операциями с общей памятью вызовнравитьсяshmgetshmatshmctlждать МожетпроходитьstraceПоследующие действия для устранения неполадок:

Язык кода:javascript
копировать
strace -e trace=ipc <command>

Устранение неполадок при вызовах, связанных с сетью

Когда дело доходит до сетевых проблем, можно специально отслеживать системные вызовы, связанные с сетью:

Язык кода:javascript
копировать
strace -e trace=network <command>

Отслеживание доставки сигналов

Отследить Полученный программой Сигнал можно:

Язык кода:javascript
копировать
strace -e signal=all <command>

Статистика системных вызовов

использовать-cпараметр ХОРОШОсистемный вызов выполнил статистический анализ:

Язык кода:javascript
копировать
strace -c <command> > output.txt

Анализ конкретного случая

Веб-сервер не может загрузить страницу должным образом. использовать strace Могут быть обнаружены следующие ошибки:

Язык кода:javascript
копировать
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)

Это указывает на то, что соединение еще не завершено, возможно, из-за задержек в сети или неправильной конфигурации.

1. Создать сокет

Язык кода:javascript
копировать
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
  • AF_INET:обозначениеиспользоватьIPv4адрес семьи。
  • SOCK_STREAM:обозначениеиспользоватьориентированный на соединениеиз、надежныйизпотоковый сокет,Это типичная характеристика протокола TCP.
  • IPPROTO_TCP:яркий确обозначениеиспользоватьTCPкак протокол транспортного уровня。
  • = 3:поверхность Указывает на успешный вызов,И возвращается сокет с файловым дескриптором (FD) 3. Дескриптор файла — это целое число, используемое операционной системой для идентификации открытых файлов, сокетов и других ресурсов ввода-вывода.

2. Попробуйте подключиться

Язык кода:javascript
копировать
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
  • 3:этотда Создано ранееизрозеткаиздескриптор файла。
  • sa_family=AF_INET:обозначение了адрес семьидляIPv4。
  • sin_port=htons(80):Номер целевого порта указывается как80,htonsФункция преобразует порядок байтов хостаиз Преобразование номера порта в сетевой порядок байтов。
  • sin_addr=inet_addr("127.0.0.1"):Цель указанаIPАдрес является локальным адресом обратной связи.,Это 127.0.0.1,Обычно используется для тестирования или подключения к локальным службам.
  • 16:этотдаориентированныйsockaddr_inструктураизуказательиз Длина байта。

connectвызовизрезультатповерхностьяркий:

  • = -1:поверхность Показыватьсистемный вызов возвратил ошибку.
  • EINPROGRESS:даодин特殊изошибкакод,Указывает, что операция подключения началась,Но это еще не сделано. Обычно это происходит с неблокирующими сокетами.,Или когда сокет установлен в неблокирующий режим.

Неблокирующие сокеты и EINPROGRESS

Когда сокет установлен в неблокирующий режим,connectвызов不会使вызов它изпроцесс挂起,Вместо этого он немедленно возвращается. Если соединение выполняется,connectЗвонок вернетсяEINPROGRESSошибка。этотданормальныйиз网络действовать Поведение,Особенно, когда вам нужно одновременно обрабатывать несколько соединений или выполнять другие задачи.

Обработка ЭИНПРОГРЕСС

Будьте правыиметь дело сEINPROGRESS,Программы могут:

  • использоватьselectилиpollсистемный вызов для мониторинга состояния сокета, определяя, когда соединение установлено или попытка соединения не удалась.
  • использоватьgetsockoptиSO_ERROR选项来查询розеткаизошибкасостояние,чтобы определить, удалось ли соединение или нет.
  • Реализуйте более сложную асинхронную логику,нравитьсяиспользоватьepollилиуправляемый событиямиизсетевая библиотека。

Примечания и советы

  • использоватьstraceпроизводительность системы может быть сниженапроизводитьопределенное влияние,Особенно в производственной среде. На сервере Apache или Nginx с высоким трафиком в производственной среде.,Диагностика проблем с производительностью,использоватьstrace来跟踪один长时间运行изпроцесс。потому чтоstrace需要捕获всеизсистемный вызови Сигнал,Этот процесс может занять много ресурсов процессора.,Это влияет на производительность сервера. в этом случае,Вы можете заметить более медленное время ответа вашего сервера.,Обработка запросов замедляется.
  • некоторый Процедуры могут включать тестированиеstraceизмеханизм,Может изменить поведение или уйти.
  • использовать-oпараметр Перенаправить вывод в файлдаодин好из Привычка,Это позволяет избежать чрезмерного вывода, вызывающего слишком быструю прокрутку экрана.

    straceдаодин功能强大изинструмент,Может помочь нам глубже понять поведение программы,Проблема с позиционированием。проходить Разумныйиспользоватьstraceизпараметр,Может эффективно уменьшить шум на выходе,Сосредоточьтесь на соответствующем системном вызове. Однако,Также помните о его потенциальном влиянии на производительность.,И при необходимости найдите альтернативные средства отладки.

Ссылки

  • Linux Documentation Project: https://www.kernel.org/doc/man-pages/
  • официальная документация strace: http://man7.org/linux/man-pages/man1/strace.1.html

Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent Technology Creation 2024. Приходите и разделите со мной приз!

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.