LINUX.ORG.RU

Определить количество оперативной памяти

 ,


0

2

На компе стоит 48Gb оперативной памяти, и вывод команды lsmem отображает правильные данные

RANGE                                  SIZE  STATE REMOVABLE  BLOCK
0x0000000000000000-0x00000000dfffffff  3.5G online       yes   0-27
0x0000000100000000-0x0000000c1fffffff 44.5G online       yes 32-387

Memory block size:       128M
Total online memory:      48G
Total offline memory:      0B

в тоже самое время команды типа free, cat /proc/meminfo, vmstat отображают другую информацию

free
              total        used        free      shared  buff/cache   available
Mem:       49245724    34189184     1039760      292840    14902972    15056540
...

vmstat -s
     49245724 K total memory
     34027332 K used memory
...

cat /proc/meminfo 
MemTotal:       49245724 kB
MemFree:          751580 kB
...

Возникает вопрос, судя по выводу этих команд, куда-то пропало более одного гигабайта оперативной памяти. Т.е. я понимаю что он не пропал конечно :) а где-то и кто-то его таки использует.

Я попробовал посчитать память которую указывает команда lspci при запросе данных об устройстве, даже если не отслеживать в выводе пересечение используемых диапазонов адресов, то там памяти набралось на чуть более чем 360М

Могу предположить что её отрезал биос на видео (хотя карта стоит внешняя, но я мог забыть убрать в биосе настройку), но тогда странно что размер потерянного куска не четко 1G а немного больше, да и как понять что это отрезано на интегрированную карту…

Подскажите, как узнать куда делось более 1G оперативки, т.е. если она не попала в доступную общую память, то кто его использует?

Перемещено hobbit из general

Ответ на: комментарий от anonymous

Для оперативки и пзу используются свли мегабайты и гигабайты, не кратные 1024, часть память забирают встройка и ssd без своей озу

Вот я как раз и спрашиваю, как узнать куда система распределила эту недостающую память?

ssnakess
() автор топика
Ответ на: комментарий от einhander

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

вы таки сами попробуйте выдать инфу этими командами в Gb и GiB

free -g
              total        used        free      shared  buff/cache   available
Mem:             46          33           0           0          14          13

...

free --giga
              total        used        free      shared  buff/cache   available
Mem:             50          35           0           0          15          15

т.е. ответ на ваш коммент - очевиден, и ОС правильно их считает памяти стоит 48Gb - никто не пишет на планках в Gib а вот то что система кудато распределила и вырезала из общей памяти более 1Gb и распределила куда-то - факт

осталось понять куда? и какой командой kinux это можно увидеть

ssnakess
() автор топика
Ответ на: комментарий от einhander

должен знать куда девается лишний гиг

Резервируется ядром.

в чем разница между гибибайтами и гигабайтами

Это актуально в основном для накопителей, никто всерьёз не измеряет RAM в десятичных единицах.

anonymous
()
Ответ на: комментарий от anonymous

Резервируется ядром.

логично - как узнать сколько зарезервировано??

в чем разница между гибибайтами и гигабайтами Это актуально в основном для накопителей, никто всерьёз не измеряет RAM в десятичных единицах.

как бы я не спрашивал в чем разница этих исчислений, я задал вопрос, как определить куда система забрала более 1Gb памяти, т.е. она его вынула из общедоступной (это видно по выводу команд типа free, vmstat и др) вопрос сколько вынула, и куда дела??

ssnakess
() автор топика
Ответ на: комментарий от anonymous

dmesg | grep reserved Ну и графика бывает интегрированная.

вывод из dmesg интересен

dmesg | grep reserved
...
[    0.000000] Memory: 3649416K/50258452K available (14344K kernel code, 3408K rwdata, 9192K rodata, 2840K init, 5936K bss, 1045588K reserved, 0K cma-reserved)
...

видно сколько зарезервировано, ну и примерно куда, хотя почти 1G просто reserved - а куда и зачем… но даже тут доступно 50258452К, хотя всего должно быть 50331648К т.е. 71,4Мб - кудато еще «улетели»

ssnakess
() автор топика

стоит 48Gb оперативной памяти

куда делось более 1G оперативки

Жадность хуже, чем холера,
Жадность губит флибустьера,
Повторяйте с нами, сэры,
Этой песенки припев.

Раз, два, три, четыре, пять,
Знаете наверно,
Раз, два, три, четыре, пять,
Жадность - это скверно,
Раз, два, три, четыре, пять,
Скажем без подвоха,
Раз, два, три, четыре, пять,
Жадность - это плохо,
Жадность - это плохо,
Жадность, я бы сказал, очень плохо.

😀

krasnh ★★★
()
Ответ на: комментарий от krasnh

Жадность хуже, чем холера, Жадность губит флибустьера, Повторяйте с нами, сэры, Этой песенки припев.

Очень смешно, для хохмачей есть другие ресурсы.

Вопрос был задан не просто так! Если каждая виртуалка будет отжирать оперативку - просто так, от нефиг делать, то ни какой памяти не напасешся.

Реально - виртуалка с CentOs 7 и ей выделено 4 гига выделено из хоста, машина дает пользоваться только 3,7G Дргуая виртуалка - 2G выделено, стоит OpenSuse 15.2 - дает использовать только 1,8G

Поэтому вопрос, куда система эти куски отрезала, как увидеть сколько отрезала, и как они используются.

ssnakess
() автор топика

Фиксикам тоже надо где-то свои чертежи хранить. Они заботливо зарезервировали. В Биосе погляди на предмет захвата оперативки для видеокарты, mesa резервирует тоже, там целая очередь на отжать себе кусочек

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от anonymous

struct task_struct

А в ней куча блоатвари ненужной.

резерв памяти под быстрое выделение

Что ты там за блоатварь в ядре выделять собрался постоянно? Память нужна реальным юзерским приложениям.

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

В Биосе погляди на предмет захвата оперативки для видеокарты, mesa резервирует тоже, там целая очередь на отжать себе кусочек

как это увидеть? какой командой можно посмотреть что куда нарезано системой?

Вывод free или vmstat не дают такой информации.

Т.е. увидеть, что да, реально 48Gb, но вот я отрезала себе ХХMb для ядра, ХХMb для видео и т.д. и т.п.

смотреть вывод dmesg | grep e820 и вывод dmesg | grep reserved

или есть что-то более удобоваримое и человекочитаемое

смотрел в сторону lshw и hwinfo но не в каждом дистрибутиве они есть, и так же есть компы со старыми ОСь куда воткнуть эти программы - проблематично

вот есть вывод hardinfo

-Memory-
<tt>00000000-00000fff </tt>		: Reserved
<tt>00001000-0009b3ff </tt>		: System RAM
<tt>0009b400-0009ffff </tt>		: Reserved
<tt>00000000-00000000 </tt>		: PCI Bus 0000:00
<tt>000a0000-000dffff </tt>		: PCI Bus 0000:00
<tt>  000c0000-000ce9ff </tt>		: Video ROM
<tt>000e0000-000fffff </tt>		: Reserved
<tt>  000f0000-000fffff </tt>		: System ROM
<tt>00100000-09e0ffff </tt>		: System RAM
<tt>09e10000-09ffffff </tt>		: Reserved
<tt>0a000000-0a1fffff </tt>		: System RAM
<tt>0a200000-0a20efff </tt>		: ACPI Non-volatile Storage
<tt>0a20f000-0affffff </tt>		: System RAM
....

здесь показаны какие адреса за кем закреплены, но вопрос тогда, что использует hardinfo чтобы выдать такой листинг?

И как посчитать тогда память? Исходя из листинга, получается что для Vieo ROM выделено E9FF байт?

ssnakess
() автор топика
Ответ на: комментарий от ssnakess

нашел откуда hardinfo тянет эти данные это

cat /proc/iomem

....
dfff0000-dfffffff : ACPI Tables
e0000000-fdffffff : PCI Bus 0000:00
  e0000000-e7ffffff : 0000:00:02.0
    e0000000-e7ffffff : vmwgfx probe
  f0000000-f01fffff : 0000:00:02.0
    f0000000-f01fffff : vmwgfx probe
  f0200000-f021ffff : 0000:00:03.0
....

причем сдвиг на пару символов относительно вышестоящей строки, явно говорит что это подсегмент вышеописанного сегмента памяти, а узнать, например, какое устройство забрало этот сегмент, можно командой lspci например устройство 0000:00:02.0

lspci -v -k -s 00:02.0

...
Host bridge: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
...

т.е. уже ближе к телу. надо попробовать посчитать диапазоны, может найду потерянный гигабайт оперативки.

хотя может всетаки есть более человекочитаемый способ получить информацию об использованной памяти?

ssnakess
() автор топика
Ответ на: комментарий от ssnakess

Насколько я знаю, там указано не то, сколько памяти расходует тот или иное устройство, а адреса в виртуальном пространстве памяти, по которым доступны эти устройства.

То есть фактически у тебя по некоторым адресам в памяти расположена не память, а регистры устройств. Не знаю, как объяснить более простым языком. Возможно, местные эксперты мне помогут.

u5er
()
Ответ на: комментарий от u5er

То есть фактически у тебя по некоторым адресам в памяти расположена не память, а регистры устройств. Не знаю, как объяснить более простым языком. Возможно, местные эксперты мне помогут.

Это понятно, но по факту получается что этот сегмент памяти выделен и закреплен за устройством или за виртуальным так сказать устройством. В ДОСе похожее было int 10h - позволяло писать напрямую в видео-память, т.е. реальное устройство int 21h - вывод текста на экран, т.е. такого устройства нет, а это просто функция которую предоставляло ядро ДОС (кажется io.sys)

то здесь получается сегмент памяти который работает с устройством, а уж какая там структура данных - зависит от устройства.

Но по факту получается что этот сегмент памяти уже нарезан и занять его другое ПО не может, т.е. я так предполагаю что тут как раз и будет часть потерянного гига оперативки. так?

ssnakess
() автор топика
Ответ на: комментарий от anonymous

расскажи это девелоперам ядра

Если объективно что-то не нужно, ты идёшь что-то там рассказывать девелоперам какой-то фигни чтобы что?

драйверы железа

Не все нужны, но подгружаются лишние. Даже у тех что нужны под вопросом на что они память расходуют.

anonymous
()
Ответ на: комментарий от ssnakess

Не совсем. Насколько я знаю, это работает примерно следующим образом:

  • машина может адресовать какое-то конкретное количество памяти, (возьмём абстрактные 100 гигов)
  • допустим, оперативки установлено 30 гигов(для упрощения). Эта память замёт часть адресного пространства. Останется 70 гигов адресного пространтсва.
  • Допустим, есть несколько сетевых устройств - видео, звук, сеть и т.д. и все они могут быть доступны через те оставшиеся 70 гигов адресного пространства.

Как-то так. Конкретные диапазоны ты можешь увидеть в файле iomem. Обрати внимание, что там есть строчки «System RAM» - это как раз диапазоны адресов, по которым расположена оперативная память.

Например, такая строчка «c0000000-dfffbfff : PCI Bus 0000:00» говорит о том, что есть устройство pci с таким-то идентификатором и оно использует такой-то диапазон адресов.

Причём, если ты посмотришь на диапазоны адресов System RAM и устройств, то увидишь, что они не пересекаются.

Обрати внимание на такой кусок

100000000-83fffffff : System RAM
  81a000000-81affffff : Kernel code
  81b000000-81bae6fff : Kernel rodata
  81bc00000-81bf3baff : Kernel data
  81c6b2000-81c9fffff : Kernel bss

Видишь? У меня по адресам «100000000-83fffffff» находится часть оперативки и вся она используется под различные части ядра - code(text?), rodata, data и bss.

Возможно, тебе стоит взять калькулятор и посчитать точное количество байт в диапазонах. Мне этим лень заниматься, если честно.

u5er
()
Последнее исправление: u5er (всего исправлений: 1)
Ответ на: комментарий от u5er

Допустим, есть несколько сетевых устройств - видео, звук, сеть и т.д. и все они могут быть доступны через те оставшиеся 70 гигов адресного пространства.

я это и имел ввиду, просто описать сложно :)

Возможно, тебе стоит взять калькулятор и посчитать точное количество байт в диапазонах. Мне этим лень заниматься, если честно.

Вот как раз сижу и считаю :) правда руками лень сижу парсер рисую :) как говориться лучше день потерять и потом за пять минут долететь :)

но на самом деле, будет нужная утилитка, т.к. на большей части виртуалок и машин под линухом (из моих компов), не стоит ни lsmem, ни hwinfo, ни другие подобные сборщики инфы о железе. А при попытке установить - ругается на репозитории (например opensuse 11.4, да сентОС 7 тоже не хочет, про убунту я ваабще молчу, вроде свежая версия, а поставить mc - танцы с бубуном) и прочие вещи.

А так получится тот же lsmem, только не по адресам покажет а по устройствам и разделам этого iomem

Что тоже полезно при настройке всяких хостинговых виртуалок, ибо там каждый гиг оперативки - существенные деньги

главное - понять где искать нужную инфу по вопросу, а то сделать то сделаю парсер, а я почему-то уверен, что всеравно останутся «белые пятна» и не сойдется объем физических планок RAM и то что написано в файлах линуха

ssnakess
() автор топика
Последнее исправление: ssnakess (всего исправлений: 1)
Ответ на: комментарий от firkax

Нет, я ж написал что всё из официальной репы (debian 11).

попробуй dmidecode -t 17 он даст инфу по каждой планке RAM (плюс увидишь на какой частоте они работают и какая задана им, поверь - есть прецеденты, когда завяленная частота на планке одна, а работает она на в половину меньшей)

и вроде на скольких дистрибах я не смотрел, даже на самых древних (ну из тех что у меня стоят), эта приблуда - установлена по умолчанию.

lsmem - особо ничего не дает кроме как общего объема планок, полезность остальной инфы, этой команды, стремится к 0 :(

ssnakess
() автор топика
Ответ на: комментарий от ssnakess

dmidecode работает, но речь была не про это, а именно про неработающий lsmem. Вообще, мне и lsmem не нужен, но неприятно что он сломан.

lsmem - особо ничего не дает кроме как общего объема планок, полезность остальной инфы, этой команды, стремится к 0 :(

Судя по твоему логу, он не планки показывает а маппинг памяти на физическое адресное пространство - это другое.

Что касается темы, то у меня на ноуте из 4ГБ установленной памяти так же «пропали» 259744КБ (примерно 253.7МБ) - видимо на видеопамять в основном.

На десктопе - из 8ГБ пропало 174172КБ (примерно 170МБ) - не знаю куда, видеокарта там отдельная.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от u5er

Потом напиши, что по итогу насчитает твой парсер. Интересно посмотреть на результаты

обязательно ) там интересно другие моменты, вот пример:

  f5000000-f60fffff : PCI Bus 0000:09
    f5000000-f5ffffff : 0000:09:00.0
      f5000000-f5ffffff : nvidia
    f6080000-f6083fff : 0000:09:00.1
      f6080000-f6083fff : ICH HD audio

т.е. узловое «устройство» забрало себе диапазон f5000000-f60fffff что составляет 17Mb на этот узел навешаны следующие «устройства», которые себе «скушали» nvidia - 16Mb ICH HD audio - 16Kb

получается, «узлу» выделено 17Mb, скушали его «подчиненные» в сумме 16,015Mb вопрос, нафига узел скушал 17? т.е. выравнивание сегментов памяти по грани 1М? - прикольно :)

и вопрос, как бы это нарисовать в парсере в человекочитаемом формате….. вот сижу и туплю, не могу придумать. с одной стороны - проще взять узловые сегменты и плевать что там внутри - посчитать объем и выдать на экран. но хочется же подробностей…. а вот как их так сгруппировать, чтобы было наглядно ….. вопрос :))

это я к тому что например в lsblk - очень классно и наглядно сделали вывод инфы, прям не верится что в линуксе. да еще в командной строке, так заморочились :) скорее всего будут в таком же стиле выдавать инфу из iomem

ssnakess
() автор топика
Ответ на: комментарий от ssnakess

Эти 17 метров - это не оперативка, а адресное пространство, так что не стоит пугаться :)

Это работает так. Всё устройство как бы составное. Например, видеокарта в системе видится как видеокарта и аудиоустройство. И именно это тебе утилита показывает.

  • f5000000-f60fffff - это на всё устройство целиком
  • f5000000-f5ffffff - это на видео часть
  • f6080000-f6083fff - а это на звуковую часть
u5er
()
Ответ на: комментарий от u5er

Эти 17 метров - это не оперативка, а адресное пространство, так что не стоит пугаться :)

это понятно

%) посчитала программа сумму, получилось 48,45Gb …. гдето не так видимо сплюсовало…. надо смотреть в дебагере но уже ближе к телу

или какое-то из адресных пространств указанных в этом выводе не траспонируется на ОП, или какието из адресных пространств там указанных перекрывают друг-друга - что более вероятно. Но главное что это уже ближе к реальности, надо просмотреть адреса которые там указанны, на их перекрытие друг другом, и проверить счетчик :)

ssnakess
() автор топика
Ответ на: комментарий от ssnakess

Я почти 5 лет как-то держал этот вопрос на задворках сознания, но всегда было лень копнуть поглубже. И, наконец в конце позапрошлого года копнул настолько глубоко, насколько мог.

В ядре есть структура struct page. На каждую страничку (4K) памяти отводится одна такая структура. Ее размер зависит от того, какая у вас разрядность ядра, если 32 битная — то структура (в ядре 6.1, что сейчас в последнем дебиане) занимает 40 байт, а в 64 битном — 64 байта из-за раздутых указателей, скорее всего. Она хранит кучу данных — подо что используется страничка, можно ли ее вытеснить в своп, и т.д. Впрочем, код говорит за себя, там напихано очень много всего: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/mm_types.h#n74

Стало быть, раз каждая страничка получает такую структуру, то мы теряем на ней 40/4096 ≈1% памяти на 32-битных системах и 64/4096 ≈ 1.5% на 64-битных.

Теперь считаем для случая в 48G (из предыдущих комменатариев видно, что используется 64-битную ось):

((48×1024³)/4096)×64 = 805306368 байт, или 786432K, или ровно 768M. Вот ваши основные потери. Остальные, как уже сказали, может быть что угодно — UEFI, встройка, зарезервированная памяти для kdump, куча всего. Но это вот — основное.

Как проверить? Загрузиться с меньшим объемом памяти (поможет опция к ядру, например mem=10G) и сравнить выхлоп

dmesg | grep reserved.

На каждый убранный таким образом гигабайт у вас должно становиться на 16 мегабайт меньше в reserved.

Проверял у себя на 64-битных и 32-битных x86, даже на MIPS’овском роутере — всегда так.

squareroot ★★★★
()
Ответ на: комментарий от squareroot

В ядре есть структура struct page. На каждую страничку (4K) памяти отводится одна такая структура. Ее размер зависит от того, какая у вас разрядность ядра….

Спасибо за ссылку на исходник. Это все понятно, т.к. выделение памяти из кучи, освобождение и прочее делает ядро, то и хранить гдето надо всю ссылочную карту, чтобы мусорщик отрабатывал, а програмер мог получать при alloc «чистую» память :)

Стало быть, раз каждая страничка получает такую структуру, то мы теряем на ней 40/4096 ≈1% памяти на 32-битных системах и 64/4096 ≈ 1.5% на 64-битных

т.е. это - абсолютно понятно и нормально, яб еще даже просто отрезал 1% общей памяти ядру, и никому его не давал, т.е. ни кому кроме ядра и устройств, чтобы не попасть в ситуацию с отсутствием свободной памяти при работе самого ядра :)

к этому вопроса то и не было :)

вопрос был простой: «Подскажите, как узнать куда делось более 1G оперативки, т.е. если она не попала в доступную общую память, то кто его использует?»

т.е. перефразирую. какую утилиту или команду линуха запустить и увидеть куда и сколько памяти потрачено ядром (системой), причем чтобы суммарный объем зарезервированного системой и общедоступной памяти, был равен общему объему планок памяти установленных в комп.

ssnakess
() автор топика
Ответ на: комментарий от einhander

Вот только модулей в Гб в принципе никто никогда не выпускает, они все в Гиб. Так что у него действительно 1,05 Гиб откушено. Что конечно много, но не запедельно для 48Г материнки.

kirill_rrr ★★★★★
()
Ответ на: комментарий от ssnakess

Резервируется ядром.
логично - как узнать сколько зарезервировано??

Скорее не ядром, ядро резервирует максимум пару сотен метров «невидимой» памяти. Там же под pci-устройства будет прилично выделяться. А если есть интеграшка, то её вообще как то жестоко глушить надо чтобы меньше ела. «использую дискретку» это ещё не значит «не выделяют видеопамять под вторую видеокарту».

Да, и я искал как то и не нашёл способа просмотреть выделенную железу память. Ядро возможно само не знает.

kirill_rrr ★★★★★
()