Вы можете попробовать это. Замените $ 9 правильным номером поля кода состояния.
awk '{if ($9 == 200) no_of_200+=1 } END{ perc=(no_of_200/NR)*100; print perc}' access.log
Существует несколько ограничений, которые применяются к сегменту mmap
и сегменту кучи. RLIMIT_AS
определяет доступное адресное пространство в целом; это охватывает все выделения памяти, которые может сделать программа. RLIMIT_DATA
определяет максимальный размер сегмента данных.
Ядро проверяет расширение стека, mmap
иbrk
(распределение кучи )на соответствие этим ограничениям. Он также проверяет выделения на потенциально конфликтующие сегменты, поэтому сегменты никогда не перезаписывают друг друга (см., например, проверки, выполняемые для выделения кучи с помощьюbrk
). Если выделение невозможно, программа «информируется» соответствующим образом :библиотека C возвращает ошибку ENOMEM
для brk
, ядро завершает программу с SIGSEGV
, если стек не может быть расширен...
То, как сегмент разделяемой памяти (, строго говоря, с точки зрения ядра, область виртуальной памяти )растет, зависит от схемы памяти, которая может очень сильно зависеть от одного процесса к другому. На большинстве архитектур «устаревшие» карты памяти приводят к выделению снизу -вверх, начиная с TASK_UNMAPPED_BASE
; не -устаревшие карты памяти приводят к выделению сверху -вниз. Для примера см.arch_pick_mmap_layout()
иmmap_is_legacy()
для архитектуры x86. Вы можете переключиться на старую карту памяти, используя setarch
флаг -L
(для примера ниже ).
На практике вы можете увидеть, как растет сегмент, взглянув на /proc/$$/maps
и проверив адреса загруженных разделяемых библиотек (, если таковые имеются ), и порядок их загрузки. Динамический компоновщик всегда загружается первым; если у нее меньший адрес, чем у других библиотек, то распределение происходит снизу -вверх, в противном случае — сверху -вниз. Сравните вывод cat /proc/self/maps
и setarch x86_64 -L cat /proc/self/maps
в 64-битной -системе x86.