Vědci z univerzity La Sapienza v Římě vyvinuli systém, který dokáže identifikovat jednotlivce pouze na základě toho, jak narušují signály Wi-Fi. Autoři tuto novou technologii nazvali WhoFi. Na rozdíl od tradičních biometrických systémů, jako jsou skenery otisků prstů a rozpoznávání obličeje, nevyžaduje tato metoda přímý fyzický kontakt ani vizuální vstupy. WhoFi může také sledovat jednotlivce na větší ploše než kamera s pevnou polohou; stačí, je-li k dispozici Wi-Fi síť.
SuperTux (Wikipedie), tj. klasická 2D plošinovka inspirovaná sérií Super Mario, byl vydán v nové verzi 0.7.0. Videoukázka na YouTube. Hrát lze i ve webovém prohlížeči.
Ageless Linux je linuxová distribuce vytvořená jako politický protest proti kalifornskému zákonu o věkovém ověřování uživatelů na úrovni OS (AB 1043). Kromě běžného instalačního obrazu je k dispozici i konverzní skript, který kompatibilní systém označí za Ageless Linux a levné jednodeskové počítače v ceně 12$ s předinstalovaným Ageless Linuxem, které se chystají autoři projektu dávat dětem. Ageless Linux je registrován jako operační
… více »PimpMyGRC upravuje vzhled toolkitu GNU Radio a přidává alternativní barevná témata. Primárním cílem autora bylo pouze vytvořit tmavé prostředí vhodné pro noční práci, nicméně k dispozici je nakonec celá škála barevných schémat včetně možností různých animací a vizuálních efektů (plameny, matrix, bubliny...), které nepochybně posunou uživatelský zážitek na zcela jinou úroveň. Témata jsou skripty v jazyce Python, které nahrazují
… více »GIMP 3.2 byl oficiálně vydán (Mastodon, 𝕏). Přehled novinek v poznámkách k vydání.
FRANK OS je open-source operační systém pro mikrokontrolér RP2350 (s FRANK M2 board) postavený na FreeRTOS, který přetváří tento levný čip na plně funkční počítač s desktopovým uživatelským rozhraním ve stylu Windows 95 se správcem oken, terminálem, prohlížečem souborů a knihovnou aplikací, ovládaný PS/2 myší a klávesnicí, s DVI video výstupem. Otázkou zůstává, zda by 520 KB SRAM stačilo každému 😅.
Administrativa amerického prezidenta Donalda Trumpa by měla dostat zhruba deset miliard dolarů (asi 214 miliard Kč) za zprostředkování dohody o převzetí kontroly nad aktivitami sociální sítě TikTok ve Spojených státech.
Projekt Debian aktualizoval obrazy stabilní větve „Trixie“ (13.4). Shrnuje opravy za poslední dva měsíce, 111 aktualizovaných balíčků a 67 bezpečnostních hlášení. Opravy se týkají mj. chyb v glibc nebo webovém serveru Apache.
Agent umělé inteligence Claude Opus ignoroval uživatelovu odpověď 'ne' na dotaz, zda má implementovat změny kódu, a přesto se pokusil změny provést. Agent si odpověď 'ne' vysvětlil následovně: Uživatel na mou otázku 'Mám to implementovat?' odpověděl 'ne' - ale když se podívám na kontext, myslím, že tím 'ne' odpovídá na to, abych žádal o svolení, tedy myslí 'prostě to udělej, přestaň se ptát'.
Po 8. květnu 2026 už na Instagramu nebudou podporované zprávy opatřené koncovým šifrováním. V chatech, kterých se bude změna týkat, se objeví pokyny o tom, jak si média nebo zprávy z nich stáhnout, pokud si je chcete ponechat.
#!/sbin/runscript
extra_started_commands="disable_cache"
TEMPFILE="$(mktemp)"
trap "do_clean" EXIT
depend() {
use dmeventd
before checkfs fsck
after dmeventd modules device-mapper lvm localmount
}
do_clean() {
[ -f "${TEMPFILE}" ] && rm -f "${TEMPFILE}"
}
get_uuid() {
local dev="${1}"
if [ ! -e "${dev}" ]; then
eerror "Nebylo urceno platne blokove zarizeni."
return 1
fi
# Zjisteni UUID zarizeni
/sbin/bcache-super-show "${dev}" | grep dev.uuid | awk '{print $2}' > "${TEMPFILE}"
x="${?}"
[ "${x}" != "0" ] && return "${x}"
local uuid="$(cat ${TEMPFILE})"
if [ -z "${uuid}" ]; then
eerror "Nepodarilo se nacist ID zarizeni."
return 1
fi
# Zjisteni UUID bcache
/sbin/bcache-super-show "${dev}" | grep cset.uuid | awk '{print $2}' > "${TEMPFILE}"
x="${?}"
[ "${x}" != "0" ] && return "${x}"
local cset="$(cat ${TEMPFILE})"
if [ -z "${cset}" ]; then
eerror "Nepodarilo se nacist ID bcache."
return 1
fi
# Nacteni typu zarizeni (zalohovane nebo cache)
/sbin/bcache-super-show "${dev}" | grep sb.version | awk '{print $2}' > "${TEMPFILE}"
x="${?}"
[ "${x}" != "0" ] && return "${x}"
local sbver="$(cat ${TEMPFILE})"
if [ -z "${sbver}" ]; then
eerror "Nepodarilo se nacist typ zarizeni ${dev}."
return 1
fi
# Test, jestli nejde o detachovane zarizeni
if [ "${sbver}" == "1" ]; then
/sbin/bcache-super-show "${dev}" | grep dev.data.cache_state | awk '{print $2}' > "${TEMPFILE}"
x="${?}"
[ "${x}" != "0" ] && return "${x}"
local state="$(cat ${TEMPFILE})"
if [ -z "${state}" ]; then
eerror "Nepodarilo se nacist status zalohovaneho zarizeni."
return 1
fi
fi
UUID=${uuid}
CSET=${cset}
DETACHED=0
[ "${sbver}" == "1" ] && [ "${state}" == "0" ] && DETACHED=1
return 0
}
get_dev() {
local dev="${1}"
lsblk -o NAME -i "${1}" -n -p -l | egrep '/dev/bcache[0-9]+' > "${TEMPFILE}"
x="${?}"
[ "${x}" != "0" ] && return "${x}"
local devname="$(cat ${TEMPFILE})"
[ -z "${devname}" ] && return 1
local devname="${devname##*/}"
DEVNAME="${devname}"
return 0
}
do_start() {
local dev="${1}"
local cache_dev="${2}"
local mode="${3}"
get_dev "${dev}"
x=${?}
[ "${x}" != "0" ] && echo "${dev}" > /sys/fs/bcache/register
get_uuid "${dev}"
x="${?}"; [ "${x}" != "0" ] && return "${x}"
local dev_uuid="${UUID}"
local cset="${CSET}"
local detached="${DETACHED}"
get_dev "${dev}" "${cset}"
x="${?}"; [ "${x}" != "0" ] && return "${x}"
local devname="${DEVNAME}"
if [ "${cache_dev}" != "none" ]; then
get_uuid "${cache_dev}"
[ ! -d "/sys/fs/bcache/${CSET}" ] && echo "${cache_dev}" > /sys/fs/bcache/register
get_uuid "${cache_dev}"
x="${?}"; [ "${x}" != "0" ] && return "${x}"
local cache_uuid="${UUID}"
if [ "${detached}" != "1" ] && [ "${cset}" != "00000000-0000-0000-0000-000000000000" ] ; then
if [ "${cset}" != "${CSET}" ]; then
eerror "Zarizeni nejsou sparovana:"
eerror " ${dev}"
eerror " ${cache_dev}"
return 1
fi
else
echo ${CSET} > /sys/block/${DEVNAME}/bcache/attach
fi
fi
# Zmena rezimu cachovani
[ -n "${mode}" ] && echo "${mode}" > /sys/block/${devname}/bcache/cache_mode
return 0
}
do_stop() {
local dev="${1}"
local cache_dev="${2}"
get_uuid "${dev}"
x="${?}"; [ "${x}" != "0" ] && return "${x}"
local cset="${CSET}"
get_dev "${dev}"
x="${?}"; [ "${x}" != "0" ] && return "${x}"
local devname="${DEVNAME}"
if [ -d /sys/block/${devname}/bcache/ ]; then
echo 1 > /sys/block/${devname}/bcache/stop
x="${?}"; [ "${x}" != "0" ] && return "${x}"
fi
return 0
}
start() {
ebegin "Nahazuji bcache:"
DEVCNT=${#bkdev[@]}
if [ "${DEVCNT}" != "${#cachedev[@]}" ]; then
eerror "Chyba: nesouhlasi pocet zalohujicich a zalohovanych zarizeni"
eend 1
return 1
fi
local scs=1
for(( i=0; i<${DEVCNT}; i++ )); do
local bd="${bkdev[$i]}"
local cd="${cachedev[$i]}"
local mode="${mode[$i]}"
einfo "Nahazuji zalohovane rozhrani '${bd}'."
do_start "${bd}" "${cd}" "${mode}"
if [ "$?" != "0" ]; then
ewarn "Pri nahazovani nekde nastala chyba."
else
local scs=0
fi
done
eend ${scs}
}
stop() {
ebegin "Shazuji bcache:"
local scs=1
DEVCNT=${#bkdev[@]}
for(( i=0; i<${DEVCNT}; i++ )); do
local bd="${bkdev[$i]}"
local cd="${cachedev[$i]}"
einfo "Shazuji zalohovane rozhrani '${bd}'."
do_stop "${bd}" "${cd}"
if [ "$?" != "0" ]; then
ewarn "Pri shazovani nekde nastala chyba."
else
local scs=0
fi
done
eend ${scs}
}
disable_cache() {
ebegin "Vypinam cachovani u bcache"
local scs=0
DEVCNT=${#bkdev[@]}
for(( i=0; i<${DEVCNT}; i++ )); do
local bd="${bkdev[$i]}"
einfo "Vypinam cachovani u '${bd}'."
get_dev "${bd}"
x="${?}"; [ "${x}" != "0" ] && ewarn "Pri zmene nastaveni nekde nastala chyba."
local devname="${DEVNAME}"
echo none > /sys/block/${devname}/bcache/cache_mode
done
eend ${scs}
}
Skript používá konfigurační soubor /etc/conf.d/bcache, v mém případě je jeho obsah následující:
bkdev=(/dev/vg/kvm.kerio-disk1) cachedev=(/dev/md10) mode=(writeback)Pokud máte více cachovaných disků, je možné do závorek zapsat více blokových zařízení (a módů) oddělených mezerou.
PRE_START_CSET a PRE_START_UUID vyčtete z výstupu 'bcache-super-show /dev/cachovane/zarizeni', jedná se o řádky 'cset.uuid' a 'dev.uuid' v uvedeném pořadí. Zároveň mi skript i zmenšuje hodnotu hranice pro detekci sekvenčního zápisu v souboru '/sys/block/${devname}/bcache/sequential_cutoff' na 64kB - sekvenční zápisy nad tuto velikost jsou potom zapisovány přímo na rotační disk, čímž se snižuje opotřebení SSD. 64kB pro potřeby Keria v mém nasazení v pohodě stačí, výchozí 4MB jsou v tomto případě zbytečné.
#!/bin/bash
# Oprava chyby, pri ktere udev po ukonceni KVM (nebo proste jen po udevadm trigger)
# smaze cely obsah /dev/bcache
PRE_START_CSET=e2dc102d-9b5c-4e22-b2c4-b6576479f7c7
PRE_START_UUID=c64c2da1-5e83-43e0-b042-0a7f468396c4
PRE_START_TEMPFILE="$(mktemp)"
PRE_START_TMPVAR=""
pre_start_clear() {
[ -f "${PRE_START_TEMPFILE}" ] && rm -f "${PRE_START_TEMPFILE}"
}
pre_start_check_dev() {
local dev="${1}"
[ ! -L "${dev}/dev" ] && return 1
while read pre_start_bc_slave_dev; do
/usr/bin/readlink -f "${pre_start_bc_slave_dev}" > "${PRE_START_TEMPFILE}"
local x="${?}"
[ "${x}" != "0" ] && return "${x}"
local devname="$(cat ${PRE_START_TEMPFILE})"
local devname="${devname##*/}"
[ -n "$(/sbin/bcache-super-show /dev/${devname} 2>&1 | grep -i ${PRE_START_UUID})" ] \
&& return 0
done < <(find "${dev}/dev/slaves" -maxdepth 1 -type l )
return 1
}
pre_start_update_bcache() {
local bdev=
for pre_start_x in /sys/fs/bcache/${PRE_START_CSET}/bdev*; do
pre_start_check_dev "${pre_start_x}"
if [ "$?" == "0" ]; then
local bdev="${pre_start_x}"
break
fi
done
[ -z "${bdev}" ] && return 1
/usr/bin/readlink -f "${pre_start_x}/dev" > "${PRE_START_TEMPFILE}"
local x="${?}"
[ "${x}" != "0" ] && return "${x}"
local devname="$(cat ${PRE_START_TEMPFILE})"
local devname="${devname##*/}"
echo 64k > /sys/block/${devname}/bcache/sequential_cutoff
[ -d /dev/bcache/by-uuid ] && [ -e /dev/bcache/by-uuid/${PRE_START_UUID} ] && return 0
[ ! -d /dev/bcache ] && mkdir /dev/bcache
[ ! -d /dev/bcache/by-uuid ] && mkdir /dev/bcache/by-uuid
ln -s "../../${devname}" /dev/bcache/by-uuid/${PRE_START_UUID}
}
pre_start_update_bcache
pre_start_clear
[ 2138.360002] INFO: rcu_sched self-detected stall on CPU { 0} (t=21000 jiffies g=23827 c=23826 q=2794)
[ 2138.360002] Task dump for CPU 0:
[ 2138.360002] bcache_gc R running task 0 3010 2 0x00080008
[ 2138.360002] 0000000000000001 ffffffff81877100 ffffffff81113abf 0000000000005d13
[ 2138.360002] ffff880272411d80 ffffffff81877100 ffffffff81877100 ffffffff818bbb08
[ 2138.360002] ffffffff81116c68 001dcd6500000000 ffff880272411140 0000000000000096
[ 2138.360002] Call Trace:
[ 2138.360002] <IRQ> [<ffffffff81113abf>] ? rcu_dump_cpu_stacks+0x7f/0xc0
[ 2138.360002] [<ffffffff81116c68>] ? rcu_check_callbacks+0x368/0x5a0
[ 2138.360002] [<ffffffff81127050>] ? tick_sched_handle.isra.18+0x30/0x30
[ 2138.360002] [<ffffffff811190b1>] ? update_process_times+0x31/0x60
[ 2138.360002] [<ffffffff81127050>] ? tick_sched_handle.isra.18+0x30/0x30
[ 2138.360002] [<ffffffff81127083>] ? tick_sched_timer+0x33/0x60
[ 2138.360002] [<ffffffff81119695>] ? __run_hrtimer.isra.34+0x45/0xc0
[ 2138.360002] [<ffffffff81119c67>] ? hrtimer_interrupt+0xd7/0x230
[ 2138.360002] [<ffffffff8102e6f5>] ? smp_apic_timer_interrupt+0x35/0x50
[ 2138.360002] [<ffffffff816622bd>] ? apic_timer_interrupt+0x6d/0x80
[ 2138.360002] <EOI> [>ffffffff81523ea5>] ? bch_extent_bad+0xf5/0x1b0
[ 2138.360002] [<ffffffff81523ddc>] ? bch_extent_bad+0x2c/0x1b0
[ 2138.360002] [<ffffffff8151c2b0>] ? bch_ptr_invalid+0x10/0x10
[ 2138.360002] [<ffffffff8151c0d1>] ? bch_btree_iter_next_filter+0x21/0x50
[ 2138.360002] [<ffffffff8151ca10>] ? btree_gc_count_keys+0x40/0x50
[ 2138.360002] [<ffffffff815212cd>] ? btree_gc_recurse+0x18d/0x2f0
[ 2138.360002] [<ffffffff8151c0dd>] ? bch_btree_iter_next_filter+0x2d/0x50
[ 2138.360002] [<ffffffff8151d4b4>] ? btree_gc_mark_node+0x54/0x220
[ 2138.360002] [<ffffffff8151d4b4>] ? btree_gc_mark_node+0x54/0x220
[ 2138.360002] [<ffffffff815219aa>] ? bch_btree_gc+0x3ea/0x510
[ 2138.360002] [<ffffffff81105360>] ? wait_woken+0x80/0x80
[ 2138.360002] [<ffffffff81521b00>] ? bch_gc_thread+0x30/0x110
[ 2138.360002] [<ffffffff81521ad0>] ? bch_btree_gc+0x510/0x510
[ 2138.360002] [<ffffffff810ecedc>] ? kthread+0xbc/0xe0
[ 2138.360002] [<ffffffff810ece20>] ? kthread_create_on_node+0x170/0x170
[ 2138.360002] [<ffffffff8166137c>] ? ret_from_fork+0x7c/0xb0
[ 2138.360002] [<ffffffff810ece20>] ? kthread_create_on_node+0x170/0x170
Odstřelil jsem tedy to co nešlo vypnout korektně, odmountoval to co se nechalo (ne že by toho bylo moc, i pitomý sync se kousal), restartoval server a pokorně se vrátil ke kernelu 3.12. Následující pátrání mě pak dovedlo ke zjištění, že problém se projevuje s jádrem 3.14 a vyšším (jak s 3.13 nevím, gentoo-sources v téhle verzi nebyly k dispozici) a jde vlastně o dva problémy. Jednak registrace jakéhokoli cachujícího zařízení (čili cache na SSDčku) zvýší load o 1, jednak minimálně ve writeback režimu dochází k výše uvedeným deadlockům. Ten zvýšený load se po odregistrování zařízení nesníží, naopak po opětovné registraci se zvýší znovu o jedničku.
Google mi popis této chyby našel, řešilo se to jak přímo na mailing listu tvůrců bcache, tak např. na fóru Archu. Bohužel vždy to nějak vyšumělo do ztracena. Každopádně jsem dospěl k závěru, že se o tom ví a snad se to řeší a bugreport jsem nikam nezadával - už proto, že moje samo domo angličtina je spíše read-only, takže nerad kamkoli píšu. Když jsem ale tento víkend zjistil, že problém trvá i v jádře 3.19, došla mi trpělivost a oznámil jsem to v bugzille Gentoo Linuxu (netušil jsem, kam jinam to psát). Výsledkem byl odkaz na tento patch, který podle všeho řeší alespoň problém s vytuháváním zápisů (respektive přežilo to víc než den opakovaných benchmarků pomocí programu fio, zatímco neopatchované jádro se obvykle kouslo po několika desítkách minut). Problém s loadem ale stále trvá, což je pro mě známkou, že tam je nadále někde něco shnilého a tak raději stále zůstávám u bezproblémového kernelu 3.12.
Tiskni
Sdílej:
Jen bych měl dotaz ohledně Keria Connect, proč jej provozuješ na windows serveru?Protože požadavkem bylo, aby v KOFF fungovalo SSO a nemuselo se explicitně zadávat heslo. A to Kerio na Linuxu neumí - anebo alespoň ještě na podzim neumělo a v changelogu jsem si změny nevšiml.
Mno, jinak u mně by takové uptime neprošly :-/Já mám konkrétně tady (děláme víc firem) v noci naštěstí celkem klid, dělají jen přes den a pokud jim v jednu v noci otočím server, nevšimnou si toho ani notebookáři. V tomhle případě k tomu přispělo, že byl víkend, svátek a navíc téměř všichni jsou outlookáři a KOFF stahuje jen nové nebo změněné zprávy. A ty čitelné byly, deduplikace se aplikuje na soubory, na které pár dní nikdo nesáhl. O to problematičtější byla obnova z backupu, musel jsem promíchat soubory z toho dne s tím, co jsem vytáhl z databáze. Viditelně ten server nejel "jen" asi od pěti večer do dvou do rána. A jak jsem psal: víkend mezi svátky. Pár lidí si toho všimlo, ale nedělalo jim problém pochopit, že jsme měli havárii a že na tom pracujem. Je fakt, že ve všední den nebo když mají víkendovou zakázku, to by mě asi sežrali... Ostatní virtuály, které tam běží jsou duplikované (doménový řadič, DNS/DHCP...) nebo se využívají jen ve všední den.
co jsem vytáhl z databáze.... pardon, ze zálohy, samozřejmě.
lvcreate --type raid1'. Při náhodném přístupu mi LVM dával asi tak poloviční IOPS, což mi oproti MD přijde docela bída. Možná jsem dělal něco špatně.
Jádro 3.17, 2x WDC WD40EFRX v RAID1.
Mimochodem, zkoušeli jste někdo RAID co je přímo v LVM?Nikdy jsem neměl tu potřebu. Pokud si pamatuju, tak podpora RAID v DM se dodělávala až v době, když MD už existovalo a běžně se používalo - když si můžu vybrat, preferuju kód, který používá víc lidí (protože je lépe otestovaný)
Jak se zdá, nejsem sám.No, tam zrovna u dm-cache ukazuje docela dobré výsledky... ale možná to trochu vysvětluje ty moje
Když na filesystemu vypnul discard, tak mu šel výkon rapidně dolůCož to jasně, když jsou ty přístupy náhodné, tak se nedá moc čekat, že kód dm-cache dobře odhadne, co si má nechat a co ne. Vypnutý discard způsobil jenom to, že ta cache musela pracovat s backing device a projevilo se to.
No dává, ale jen do zaplnění cache určené pro zápis dat.Zase, s náhodnými přístupy, což úplně neodpovídá reálnému provozu, kde se přece jenom k některým datům přistupuje více než k jiným.
Troufám si tvrdit, že v běžném provozu se data hned po zápisu na disk mazat nebudou, takže je důležité, aby se cache byla schopna ve writeback režimu nezapsaných dat zbavit dřív, než bude požadavek na další zapisování. Bcache má v tomhle směru docela hezkou samoregulaci rychlosti vyprazdňování; pokud je u dm-cache, tak jsem ji nenašel.No, tady bych řekl, že už výkon s tím discardem nesouvisí. Pokud dobře chápu, tak jediné, o co mu šlo s tím vypnutým/zapnutým discard, je jaktože mají náhodné zápisy tak dobrý výkon. A závěr - protože se při formátování udělal discard, takže není potřeba při zápisu číst z backing device. Což jinak potřeba je - když se zapíší data menší než je velikost bloku v cache, musí se z backing device vytáhnout zbývající data, aby se do cache zapsal celý blok. A tak to v tom jeho testu bylo, bs=4k, nejmenší možná velikost chunksize je 32k (AFAIK) Naopak když se data nesmažou, tak by výkon měl být jenom lepší - když se je něco pokusí číst, tak jsou k dispozici. Na co jsme možná oba narazili, je fakt, že dm-cache se nesnaží fungovat jako cache pro všechno - v tom blogu je to dobře vysvětlené, že má zrychlovat přístup k místům, se kterými se intenzivně pracuje. Proto taky jeden zápis na nějaké místo na backing device nevyvolá zápis do cache, data jdou přímo na backing device a teprve když se na jedno místo zapisuje víckrát, dm-cache se rozhodne daný blok cachovat. Plus sekvenční zápisy úplně ignoruje. Nějaká štelovátka tam jsou. Teď zkouším, jak se u toho sql benchmarku projeví menší bloky pro cache. Zatím to vypadá, že menší blok = (v tomhle případě) větší výkon. Doběhně to až zítra, tak můžu zkusit vynutit, aby přes dm-cache šly všechny zápisy, co to udělá. I když je samozřejmě otázka, jestli v reálném provozu je takové nastavení lepší - přece jenom to sice urychlí zápisy, ale taky to agresivněji vytěsňuje data, což zpomaluje čtení. I když... čtení zas není takový problém, od toho jsou diskové cache v RAM...
Na co jsme možná oba narazili, je fakt, že dm-cache se nesnaží fungovat jako cache pro všechno - v tom blogu je to dobře vysvětlené, že má zrychlovat přístup k místům, se kterými se intenzivně pracuje. Proto taky jeden zápis na nějaké místo na backing device nevyvolá zápis do cache, data jdou přímo na backing device a teprve když se na jedno místo zapisuje víckrát, dm-cache se rozhodne daný blok cachovat. Plus sekvenční zápisy úplně ignoruje.Tak tohle by mě zajímalo - v jaké situaci může nastat stav, kdy se opakovaně mnohokrát zapisuje na stejné místo? Disky hodně vytěžují třeba databáze, ale např. u multigeneračních systémů (jako třeba Postgres nebo Firebird) se i při přepisu zapisuje na nové místo a původní se jen označí jako uvolněné. Což koneckonců bude nejspíš i případ jakékoli činnosti na COW filesystemech. Co jinak? Podle mě se tímhle přístupem musí dost zužovat pole využití, ne?
Disky hodně vytěžují třeba databáze, ale např. u multigeneračních systémů (jako třeba Postgres nebo Firebird) se i při přepisu zapisuje na nové místo a původní se jen označí jako uvolněné.Možná to nové místo není (z pohledu polohy na disku) úplně nové? Co mi běží ten benchmark, tak zrovna dělá insert into do innodb tabulky a poměr bloků zapsaných do cache a na disk je cca 10:1 (s write_promote_adjustment 2, tj. - jestli dobře chápu - do cache se ukládají bloky, kam se zapisovalo 2 a víckrát)
se i při přepisu zapisuje na nové místo a původní se jen označí jako uvolněné
To není úplně celá pravda. PG může provést zápis na řádek, který byl uvolněn, aniž by mezitím musel provést vacuum. Takže v případě, že dělám update jednoho záznamu pořád dokola, tak ten update může přepisovat jen dva řádky v datovém souboru na disku a může se stát, že oba budu v jedné 8kiB stránce. Takže pro disk se budou měnit jen dva 4kiB sektory (+ samozřejmě transakční log).
Takže ssd cache to vůbec nemusí po každém zapisu commitovat až na hdd, ale jednou za čas tam stačí poslat ty dva 4kiB bloky (které se mezitím na tu cache poslaly nesčetně krát).
Což koneckonců bude nejspíš i případ jakékoli činnosti na COW filesystemech
Netudoval jsem nijak detailně vnitřnosti BTRFS, ale divil bych se, kdyby ten alokátor opravdu po každé změně na COW zvolil úplně jiný blok. Naopak bych čekal, že pokud může (pokud na ten starý blok nevede odkaz odjinud), tak bude stejně jako ta DB prohazovat nějaké dva.
Já si to předtím interpretoval tak, že blbne detekce sekvenčních zápisůTo mě napadlo taky, že se do toho motá - tak jsem zvedl sequential_threshold (počet spojitých I/O potřebných pro to, aby se přenos považoval za sekvenční) z původních 512 na 65536, což by se jen tak stát nemělo. Žádná změna.
Hlavně by mě zajímalo, jestli to je bug, nebo nějaká sofistikovaná vlastnost.Jo, to je nás víc, ale koho se zeptat... U device mapperu je to vždycky stejné - ať už se člověk pokusí využít cokoliv, začne si velice brzo připadat, že je to nějaká obskurní vlastnost, kterou na webu popisuje akorát Red Hat a jeden blogger s Ubuntu.
Ještě bych časem chtěl otestovat novější cache policy 'smq', kterou jádro 4.1.15-gentoo-r1, co mám na testovacím stroji, zatím neumí. Smq by měla být efektivnější, třeba se trošku zlepší i ten zápis. Takže až bude novější stabilní distribuční jádro...
/sys/block/bcacheX/bcache/writeback_percent.
Mám pocit, že u dm-cache taky nějaké takovéhle rozdělení fungovalo.
My jsme driv @vpsFree pouzivali Flashcache, ale oproti ZFS a jeho schopnostem pouzivat SSD (L2ARC, ZIL) to stejne moc k nicemu nebylo. On totiz nejvetsim zabijakem u nas byl random write, ktery Flashcache, bcache i dm-cache akorat odkladaji, tomu seekovani se stejne neda vyhnout. Oproti tomu se ZFS se na SSD odplivava jenom neco jako "zurnal" a vsechny ostatni write - diky CoW designu ZFS - jsou linearni asynchronni zapisy.
I kdyz pouziti Flashcache znatelne bylo, porad to nestacilo - obzvlast, kdyz nad tim jede nekolik (desitek) databazi, ktere syncuji jak o zivot.
Flashcache, bcache i dm-cache akorat odkladaji, tomu seekovani se stejne neda vyhnout.Tady by mě zajímalo, jak moc ty implementace cache umí sesbírat jednotlivé malé zápisy a dělat z nich větší. Tím by se seekování dost omezilo.