Obrovská cache paměti

Obrovská cache paměti
« kdy: 07. 06. 2021, 12:38:24 »
Ahoj všem, máte pro mě prosím nějaké tipy, jak udělat troubleshooting, proč mám plnou paměť, až to swapuje a systém zamrzá?

Memory
Citace
Total: 16G
Used: 5G
Free: 100M
Cache: 9G
Buffers: Skoro nic

Měl jsem za to, že cache se automaticky uvolňuje pokud o tu paměť požádá jiný proces.

Zkoušel jsem něco jako:

Kód: [Vybrat]
sync && echo 3 > /proc/sys/vm/drop_caches
Ani jeden z příkazů ale nic nedělá, jen mi zablokují konzoli.

Zkoušel jsem i něco jako:
Kód: [Vybrat]
sysctl drop_caches=3
Ale to dělalo stejné prd jako výše uvedené příkazy.

Pak jsem ještě zkoušel cgroups pro memory limit toho procesu co takhle plní cache, to se ami ale nepovedlo, viz: https://forum.root.cz/index.php?topic=24845.0

Díky všem za tipy.

BTW: Neptejte se co je to za aplikaci, chci to řešit univerzálně a systémově. Ne nějak přímo přes nějaké konfigurace aplikace.


Re:Obrovská cache paměti
« Odpověď #1 kdy: 07. 06. 2021, 12:52:41 »
Jako prvni bych se podival na swappiness

Kód: [Vybrat]
cat /proc/sys/vm/swappiness
a pokud neni nastaveno na 0, tak bych tak ucinil

Kód: [Vybrat]
echo 0 > /proc/sys/vm/swappiness

Re:Obrovská cache paměti
« Odpověď #2 kdy: 07. 06. 2021, 13:03:08 »
Default v Centosu je 10 %.
Když nastavím nulu jak navrhuješ, tak vypnu swap, což jsem už zkoušel přes "swapoff", ale asi to k ničemu nebylo, má vůbec vliv zapnutí/vypnutí swapu na objem cache paměti?

Diskovou cache já přece vůbec neřeším, řeším cache paměti, nikoliv swap.

Nebo to spolu nějak souvisí? Pokud ano, jak? Díky.

RDa

  • *****
  • 2 465
    • Zobrazit profil
    • E-mail
Re:Obrovská cache paměti
« Odpověď #3 kdy: 07. 06. 2021, 13:08:01 »
Pozor na:
Citace
The "cached" total will also include some other memory allocations, such as any tmpfs filesytems.

Takze se podivej na mount a df, zda v /dev/shm a /tmp pokud je ramdisk, nemas nejaka mrtva data.

Re:Obrovská cache paměti
« Odpověď #4 kdy: 07. 06. 2021, 14:27:00 »
Default v Centosu je 10 %.
Když nastavím nulu jak navrhuješ, tak vypnu swap, což jsem už zkoušel přes "swapoff", ale asi to k ničemu nebylo, má vůbec vliv zapnutí/vypnutí swapu na objem cache paměti?

Diskovou cache já přece vůbec neřeším, řeším cache paměti, nikoliv swap.

Nebo to spolu nějak souvisí? Pokud ano, jak? Díky.

Vychazel jsem z prvniho prispevku, kde pises, ze ti to swapuje.

Kdyz nastavis swappiness na 0, tak tim nevypinas swap. Jen tim minimalizujes moznost, ze se nejaka data do swapu dostanou. Jestli jsi ale zkousel swap kompletne vypnout a pote se problem znovu ukazal, tak moji radu ignoruj a hledej jinde.


Re:Obrovská cache paměti
« Odpověď #5 kdy: 07. 06. 2021, 15:14:10 »
nevím co jsou to "mrtvá data". Já ramdisk nedělal ale nějaké tmpfs tu jsou.

takhle vypadá ten mount a df:

Kód: [Vybrat]
[root@localhost ~]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=8029984k,nr_inodes=2007496,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime,seclabel)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpu,cpuacct)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_cls,net_prio)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,rdma)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
none on /sys/kernel/tracing type tracefs (rw,relatime,seclabel)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mapper/cl-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /mnt/petr type autofs (rw,relatime,fd=28,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=24048)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel,pagesize=2M)
debugfs on /sys/kernel/debug type debugfs (rw,relatime,seclabel)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=41,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=24094)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
/dev/sdd on /mnt/ssd type ext4 (rw,relatime,seclabel)
/dev/sdf1 on /mnt/thin type ext4 (ro,relatime,seclabel,stripe=8191)
/dev/sde1 on /mnt/hgst type ext4 (rw,relatime,seclabel)
/dev/mapper/cl-centos on /home type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/sdc1 on /boot type ext4 (rw,relatime,seclabel)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
tmpfs on /run/user/1001 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=1609700k,mode=700,uid=1001,gid=1001)
gvfsd-fuse on /run/user/1001/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1001,group_id=1001)
//10.0.0.24/petr on /mnt/petr type cifs (rw,nosuid,nodev,noexec,relatime,vers=1.0,cache=strict,username=admin,uid=1001,forceuid,gid=1001,forcegid,addr=10.0.0.24,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=61440,wsize=65536,bsize=1048576,echo_interval=60,actimeo=1,x-systemd.automount,_netdev)
/dev/sda1 on /mnt/blue type ext4 (ro,relatime,seclabel,stripe=8191)
/dev/sdb1 on /mnt/blue2 type ext4 (ro,relatime,seclabel,stripe=8191)
/dev/sdg1 on /run/media/surf/Thin type ext4 (rw,nosuid,nodev,relatime,seclabel,stripe=8191,uhelper=udisks2)
/dev/sdg1 on /mnt/thin type ext4 (rw,relatime,seclabel,stripe=8191)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
[root@localhost ~]# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               7.7G     0  7.7G   0% /dev
tmpfs                  7.7G  1.3M  7.7G   1% /dev/shm
tmpfs                  7.7G   74M  7.7G   1% /run
tmpfs                  7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/mapper/cl-root     50G   29G   22G  58% /
/dev/sdd               458G   73M  435G   1% /mnt/ssd
/dev/sdg1              293G  154G  124G  56% /mnt/thin
/dev/sde1              458G  165G  270G  38% /mnt/hgst
/dev/mapper/cl-centos  150G   36G  114G  24% /home
/dev/sdc1              976M  293M  616M  33% /boot
tmpfs                  1.6G  6.0M  1.6G   1% /run/user/1001
//10.0.0.24/petr       5.5T  3.8T  1.8T  69% /mnt/petr
/dev/sda1              457G   15G  419G   4% /mnt/blue
/dev/sdb1              457G   19G  415G   5% /mnt/blue2
[root@localhost ~]#

jinak bych tu měl ještě /dev/mapper/cl-swap

Re:Obrovská cache paměti
« Odpověď #6 kdy: 07. 06. 2021, 15:27:15 »
Ano, swapuje, ale to, že swapuje je přece správně? Kdyby neswapoval, tak by to bylo jen horší, takže vypnutí swapu se mi nezdá jako řešení, já potřebuji asi nějak spíše zamezit, abych měl více free, než aby se celá kapacita volné paměti 10G zahltila mezipamětí.

Re:Obrovská cache paměti
« Odpověď #7 kdy: 07. 06. 2021, 16:16:59 »
a kolik jsou teď tyto hodnoty a nezlepší se to, když je přepíšete?

Kód: [Vybrat]
vm.vfs_cache_pressure=200
vm.swappiness=10
vm.dirty_bytes=67108864
vm.dirty_background_bytes=33554432

RDa

  • *****
  • 2 465
    • Zobrazit profil
    • E-mail
Re:Obrovská cache paměti
« Odpověď #8 kdy: 07. 06. 2021, 16:33:59 »
nevím co jsou to "mrtvá data".

Napr. kdyz v Gentoo prenastavim portage temp dir, kde se buildi do ramdisku a ono to spadne, tak tam zustane treba rozdelana kompilace - pri vetsich baliccich klidne i 1GB.

Vy v tom tmpfs mate jen 1.3+74+6M pouzito, takze to s tim souviset nebude.

Jeste jsem nasel, ze pod cache se taky pocitaj virtualky - nemate neco takoveho pustene? Jinak si uz nedokazu vysvetlit, proc by to drop_caches nemel zrusit. Pripadne specialni soft, co ma pamet zapinovanou pro DMA prenosy.. buhvi.

Re:Obrovská cache paměti
« Odpověď #9 kdy: 07. 06. 2021, 16:45:44 »
Posílám požadované hodnoty proměnných sysctl:

Kód: [Vybrat]
vm.vfs_cache_pressure  = 100
vm.swappiness = 10
vm.dity_bytes = 0
vm.dirty_background_bytes = 0

Procesy virtuální paměti ukazují asi hodně, ale pokud tím jsou myšleny virtuální servery nebo tak něco, tak to nevedu.

Jak poznám aplikaci, která má zmíněnou zapinovanou paměn pro DMA?

Jeden z Vás se měl ještě přes e-mail ptal na slabtop, tak ho posílám v příloze také. Konkrétně se ptal na dentry, které udajně nelze smazat, možná to souvisí s tím DMA

Asi by se mi nejvíce líbilo právě někde třeba přes cgroup nejak buď globálně omezit, aby nemohl existovat proces s více než pár stovek MB cache. Úplně nejlépe kdybych mohl přes cgroup přidělovat jednotlivým aplikacím maximum využití paměti. To se mi ale nedeaří pro moji neznalosti syntaxe linuxu. :-D Viz zde: https://forum.root.cz/index.php?topic=24845.0
« Poslední změna: 07. 06. 2021, 16:49:22 od scientific »

Re:Obrovská cache paměti
« Odpověď #10 kdy: 07. 06. 2021, 21:49:07 »
pokud je vm.dirty_bytes = 0 a vm.dirty_background_bytes = 0, znamená, že jsou nastaveny vm.dirty_ratio a vm.dirty_background_ratio (tak to bylo u starých jader), což jsou procenta z celkové RAM a bývalo to docela hodně, myslím to bývalo 10 a 15 %. Nahraďte to těmi 32 a 64 MB, jak jsem psal.

vfs_cache_presure taky zvětště na těch 200, to zvýší tlak na vyprazdňování cache a bude teda menší

e3k

  • ***
  • 217
    • Zobrazit profil
    • E-mail
Re:Obrovská cache paměti
« Odpověď #11 kdy: 07. 06. 2021, 22:07:50 »
ja bych se podival do demsg jestli tam nemate nas...ypano.

Re:Obrovská cache paměti
« Odpověď #12 kdy: 07. 06. 2021, 23:43:20 »
@Jan Fikar
To co zmiňuješ mám nastaveno takto no:
Kód: [Vybrat]
vm.dirty_background_ratio = 10
vm.dirty_ratio = 40

Mám to tedy být jak to je plus tomu nastavit jak radíš tedy takto:
Kód: [Vybrat]
sysctl vm.vfs_cache_pressure=200
sysctl vm.swappiness=10
sysctl vm.dirty_bytes=67108864
sysctl vm.dirty_background_bytes=33554432
sysctl vm.dirty_background_ratio = 10
sysctl vm.dirty_ratio = 40

Chápu to správně? Snad takto nastavené to zůstane perzistentní a nezmizí to nastavení po rebootu, jinak bych to hádám musel vepsat přímo někam do do souboru /proc/sys/vm/neco?

@e3k: Taky mě to napadlo, ale nic zajímavého co by se týkalo memory tam nevidím.

Jediné trochu zajímavé je, že je tam zaznamenán můj marný pokus o vyprázdnění mezipaměti:

Kód: [Vybrat]
700.735222] bash (487150): drop_caches: 3
[434700.735224] bash (483853): drop_caches: 3
[434701.746225] bash (481074): drop_caches: 3
[434701.747414] sysctl (487765): drop_caches: 3

k3dAR

  • *****
  • 2 838
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Obrovská cache paměti
« Odpověď #13 kdy: 08. 06. 2021, 02:12:10 »
[...] Mám to tedy být jak to je plus tomu nastavit jak radíš tedy takto:
Kód: [Vybrat]
sysctl vm.vfs_cache_pressure=200
sysctl vm.swappiness=10
sysctl vm.dirty_bytes=67108864
sysctl vm.dirty_background_bytes=33554432
sysctl vm.dirty_background_ratio = 10
sysctl vm.dirty_ratio = 40

Chápu to správně? Snad takto nastavené to zůstane perzistentní a nezmizí to nastavení po rebootu, jinak bych to hádám musel vepsat přímo někam do do souboru /proc/sys/vm/neco?
[...]

chapes co nekolikanasobne spatne ;-)
- NEdavaji se mezery kolem =
- sysctl NEnastavuje perzistentne
- v /proc/sys/vm/neco NEjsou (realne) soubory a "zapis" NEni perzistentni
- nastavit vm.dirty*bytes a zaroven vm.dirty*ratio je nesmyl, jsou to 2 moznosti, s tim ze kazda vypina tu predchozi
- pokud to chces nastavit na "stalo", tak v /etc/sysctl.conf, nebo vytvor samostatne /etc/sysctl.d/60-scientific-tuner.conf (cislo >=60, nazev je jedno, koncovka .conf povinna)

BTW: https://www.linuxatemyram.com ;-)

Re:Obrovská cache paměti
« Odpověď #14 kdy: 08. 06. 2021, 10:17:49 »
jak říká k3dAR: když použijete vm.dirty_bytes i vm.dirty_ratio, tak ten poslední příkaz přemaže ten předchozí

takže všechno s *_ratio vynechat a používat jen *_bytes

takže do /etc/sysctl.conf nejlépe na konec napsat

Kód: [Vybrat]
vm.vfs_cache_pressure=200
vm.swappiness=10
vm.dirty_bytes=67108864
vm.dirty_background_bytes=33554432

to se aktivuje po restartu, případně ručně sudo sysctl -p

a v sysctl.conf mezery kolem rovnítka nevadí