Script för att optimera mdadm raid array.

Permalänk
Medlem

Script för att optimera mdadm raid array.

Hej på er,

Har ett gammalt script som jag använt flitigt av för att hitta rätt inställningar för diverse
för att få ut bäst hastighet i mina mjukisraid.
Har använt mig av följande script.

Nu har diskarna blivit lite snabbare och fler så jag får följande fel.
This script was created for all speeds measured in MB/s
ABORT

Jag förstår att det är på grund av att output i dd visas i GB/s eftersom hastigheten är så pass hög.
Jag skulle behöve hjälp med att anpassa scriptet så att den fungerar oavsett hastighet.
Antar att outputen kommer bli antingen GB/s eller MB/s

Så lösningen skulle vara att skriva om scriptet så att ifall hastigheten resulterar i GB/s så
skall det omvandlas till MB/s
Eller om det går att ändra outputen till att alltid skriva i MB/s

Någon som skulle kunna hjälpa mig med det?

/S

Permalänk
Medlem

Har du tittar i scriptor själv? Det är en bra introduktion till sys admin att du går igenom det själv och rättar till outputen.

Sen är det väldigt mycket redundans, som extra credit kan du skriva om det så att testerna körs med en iterativ loop istället för att skrivas tre gånger

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av Garmzon:

Har du tittar i scriptor själv? Det är en bra introduktion till sys admin att du går igenom det själv och rättar till outputen.

Sen är det väldigt mycket redundans, som extra credit kan du skriva om det så att testerna körs med en iterativ loop istället för att skrivas tre gånger

Skickades från m.sweclockers.com

Problemet är att jag inte kan skriva kod själv

Permalänk
Medlem

Bash-scripting är både jättelätt och jättesvårt, vem som helst kan knåpa ihop ett mindre script för enklare åtgärder men att göra ett större script snyggt och effektivt är jättesvårt. ("sed" och "awk" är två frekvent förekommande kommandon som tillsammans med reguljära uttryck/regex kan göra nästan vad som helst och det går att krångla till det något enormt samtidigt...)

Det enklaste du kan göra nu är att ändra alla rader som ser ut som rad 74:

if [ $WRUN1 != "MB/s" ];

till

if [ $WRUN1 != "MB/s" ] || [ $WRUN1 != "GB/s" ]; #Double pipe || betyder ELLER i bash

Då kommer inte programmet att avbrytas bara för att överföringshastigheten blir för hög men det löser inte problemet att du vill se den med rätt enhet. Då måste man blanda in "bc" (basic calculator) som på rad 111 tillsammans med en if-sats.

Visa signatur

Det finns bara två sorters hårddiskar: de som har gått sönder och de som skall gå sönder.

Permalänk
Medlem
Skrivet av zarkov:

Bash-scripting är både jättelätt och jättesvårt, vem som helst kan knåpa ihop ett mindre script för enklare åtgärder men att göra ett större script snyggt och effektivt är jättesvårt. ("sed" och "awk" är två frekvent förekommande kommandon som tillsammans med reguljära uttryck/regex kan göra nästan vad som helst och det går att krångla till det något enormt samtidigt...)

Det enklaste du kan göra nu är att ändra alla rader som ser ut som rad 74:

if [ $WRUN1 != "MB/s" ];

till

if [ $WRUN1 != "MB/s" ] || [ $WRUN1 != "GB/s" ]; #Double pipe || betyder ELLER i bash

Då kommer inte programmet att avbrytas bara för att överföringshastigheten blir för hög men det löser inte problemet att du vill se den med rätt enhet. Då måste man blanda in "bc" (basic calculator) som på rad 111 tillsammans med en if-sats.

Ja det kommer gå igenom utan stopp men hur blir det med beräkningen av hastigheten
Kommer han tro att 200MB/s är snabbare än 1.2GB/s?

Permalänk
Medlem
Skrivet av Superthug:

Ja det kommer gå igenom utan stopp men hur blir det med beräkningen av hastigheten
Kommer han tro att 200MB/s är snabbare än 1.2GB/s?

Hjälpte inte.
Den stannar på första körningen.

if [ $WRUN1 != "MB/s" ] || [ $WRUN1 != "GB/s" ];

så ser den raden ut nu.
Är det verkligen rätt kod?

Permalänk
Medlem

Testa att även skriva ut $WRUN1 så du vet vad den innehåller.

Jag kan inte Bash men testa att skriva så här:

echo "This script was created for all speeds measured in MB/s. WRUN1 = $WRUN1"

Felmeddelandet skrivs ut på mer ät ett ställe. Lägg till något unikt i varje så du vet exakt vilket av dem det är som skrivs ut.

Permalänk
Medlem

En tanke utan att "kunna" detta, om du istället just nu skulle använda 2 script? Ett med MB/s och ett med GB/s.

För då ser jag det som om det räcker med att du ändrar MB till GB överallt?

Kör du Script 1 (MB) och det blir fel pga hastighet kör du Script 2 med (GB) det är inte det snyggaste men löser ditt problem just nu? (om man bara kan ändra MB till GB då)

Permalänk
Medlem

Jag skulle nog kunna anpassa detta script så det fungerar med både MB och GB om du vill. Det kanske tar en stund och vet inte när jag har tid att fixa det men kan nog 100% göra det.

mvh
Axel

Visa signatur

Chassi: Fractal Design Meshify C | Ram: 16 GB DDR3 | SSD: Samsung Evo 840 250GB | HDD: 2TB Segate barracuda | SSD2: INTEL SSDSA2M120G2GC | Grafikkort: Nvidia Geforce GTX 970 ASUS Strix | Prosessor: Intel Core i7 4770-K | Moderkort: MSI Z87-G45|

Permalänk
Medlem
Skrivet av Superthug:

Ja det kommer gå igenom utan stopp men hur blir det med beräkningen av hastigheten
Kommer han tro att 200MB/s är snabbare än 1.2GB/s?

Vem är han? Skall någon annan använda scriptet också?

Skrivet av Superthug:

Hjälpte inte.
Den stannar på första körningen.

if [ $WRUN1 != "MB/s" ] || [ $WRUN1 != "GB/s" ];

så ser den raden ut nu.
Är det verkligen rätt kod?

Ja, det borde stämma. Möjligen behövs det några fler fyrkantsparenteser, det skiljer lite mellan olika versioner av shell så en annan variant är:

if [[ $WRUN1 != "MB/s" || $WRUN1 != "GB/s" ]];

Vet du med säkerhet att "dd" kastar ur sig just "GB/s" och inget annat? Allt annat kommer att ge fel, även "Gb/s".

Skrivet av Azathoth:

En tanke utan att "kunna" detta, om du istället just nu skulle använda 2 script? Ett med MB/s och ett med GB/s.

För då ser jag det som om det räcker med att du ändrar MB till GB överallt?

Kör du Script 1 (MB) och det blir fel pga hastighet kör du Script 2 med (GB) det är inte det snyggaste men löser ditt problem just nu? (om man bara kan ändra MB till GB då)

Jobbigt om diskarna klarar GB/s med stora filer men inte med små, hur gör man då?

Visa signatur

Det finns bara två sorters hårddiskar: de som har gått sönder och de som skall gå sönder.

Permalänk
Medlem
Skrivet av Azathoth:

En tanke utan att "kunna" detta, om du istället just nu skulle använda 2 script? Ett med MB/s och ett med GB/s.

För då ser jag det som om det räcker med att du ändrar MB till GB överallt?

Kör du Script 1 (MB) och det blir fel pga hastighet kör du Script 2 med (GB) det är inte det snyggaste men löser ditt problem just nu? (om man bara kan ändra MB till GB då)

Det komme rinte att fungera på grund av dem olika testerna som görs.
Vid helt fel inställningar blir ju hastigheten skit och då kör den i MB/s men med "mer" rätt inställning
så blir det snabbare och GB/s som resultat.

Permalänk
Medlem
Skrivet av Adrawo:

Jag skulle nog kunna anpassa detta script så det fungerar med både MB och GB om du vill. Det kanske tar en stund och vet inte när jag har tid att fixa det men kan nog 100% göra det.

mvh
Axel

Jag bjuder på öl!
Ingen brådis här.

/S

Permalänk
Medlem

@zarkov: Han = scriptet

Ska testa med dubbla [[ och ]] nu.
Har satt en liten tagg i varje echo så jag ser var scriptet failar
I första testet där den gör 3 mätningar med 64kb cache.
Där stannar scriptet direkt efter första mätningen när resultatet kommer.
Det förstår jag att den failar då stripe cache helt enkelt är för liten.

Återkommer

Permalänk
Medlem
Skrivet av zarkov:

Vem är han? Skall någon annan använda scriptet också?

Ja, det borde stämma. Möjligen behövs det några fler fyrkantsparenteser, det skiljer lite mellan olika versioner av shell så en annan variant är:

if [[ $WRUN1 != "MB/s" || $WRUN1 != "GB/s" ]];

Vet du med säkerhet att "dd" kastar ur sig just "GB/s" och inget annat? Allt annat kommer att ge fel, även "Gb/s".
Jobbigt om diskarna klarar GB/s med stora filer men inte med små, hur gör man då?

We are testing md stripe_cache_size
step 1/4: NOW your current value of /sys/block/md0/md/stripe_cache_size is 64
.
This script was created for all speeds measured in MB/s 1
ABORT

Gick inte med dubbla fyrkansparenteser.

Permalänk
Medlem

@Superthug:
Där den säger att den avbryter: if [ $WRUN1 != "MB/s" ]; eller vilken rad det nu är så prova att skriva, direkt ovanför raden:
echo "BREAKPOINT" $WRUN1 då kommer den skriva ut på skärmen vad WRUN1 innehåller så kan du jämföra med Mb/s.

Edit: Så beroende på outputen där så kan man antingen byta ut befintlig kod eller lägga till en || if satsen för att fånga båda.

Visa signatur

.

Permalänk
Medlem
Skrivet av fragwolf:

@Superthug:
Där den säger att den avbryter: if [ $WRUN1 != "MB/s" ]; eller vilken rad det nu är så prova att skriva, direkt ovanför raden:
echo "BREAKPOINT" $WRUN1 då kommer den skriva ut på skärmen vad WRUN1 innehåller så kan du jämföra med Mb/s.

Edit: Så beroende på outputen där så kan man antingen byta ut befintlig kod eller lägga till en || if satsen för att fånga båda.

Ingen riktig fix. Låt säga att outputen är run 1GB/s
Ena körningen hamnar den under och blir MB/s och andra gången GB/s

Jag vill inte ha själva outputen utan scriptet ska ju fungera som det är tänkt.
Köra test av hastighet och jämföra för att hitta bäst inställningar.

Permalänk
Medlem

Eftersom den avbryter ifall den inte är MB eller inte GB så ändra till att && mellan uttrycken, dvs den ska inte vara någon av dem.

if [ $WRUN1 != "MB/s" && $WRUN1 != "GB/s" ];

Permalänk
Medlem
Skrivet av Superthug:

Ingen riktig fix. Låt säga att outputen är run 1GB/s
Ena körningen hamnar den under och blir MB/s och andra gången GB/s

Jag vill inte ha själva outputen utan scriptet ska ju fungera som det är tänkt.
Köra test av hastighet och jämföra för att hitta bäst inställningar.

Beroende på vad den visar så kan vi göra en riktig fix. Det är liksom tanken. Men måste veta vad den visar först eftersom det befintliga inte funkar och jag kan inte testköra det själv.

Som pake ovan hintar om.

Visa signatur

.

Permalänk
Medlem
Skrivet av fragwolf:

Beroende på vad den visar så kan vi göra en riktig fix. Det är liksom tanken. Men måste veta vad den visar först eftersom det befintliga inte funkar och jag kan inte testköra det själv.

Som pake ovan hintar om.

Ja den visar ju antingen xxMB/s eller xxGB/s
Hastigheten exakt varierar ju jättemycket beroende på vilka settings den kör med.

Permalänk
Medlem
Skrivet av Pake:

Eftersom den avbryter ifall den inte är MB eller inte GB så ändra till att && mellan uttrycken, dvs den ska inte vara någon av dem.

if [ $WRUN1 != "MB/s" && $WRUN1 != "GB/s" ];

Detta verkar ha gjort susen.
Ska låta den köra färdigt och se hur den tolkar resultat MB/s mot GB/s
Edit: Måste dock vara
if [ $WRUN2 != "MB/s" ] && [ $WRUN2 != "GB/s" ];

Annars gnäller den om saknade ]

Permalänk
Medlem

Verkar bli fel då den räknar MB mot GB

found new best read - old: 1.60 new: 634.33
We are testing md readahead

634MB/s är snabbare än 1.6GB/s enligt scriptet.

Permalänk
Medlem
Skrivet av Superthug:

Verkar bli fel då den räknar MB mot GB

found new best read - old: 1.60 new: 634.33
We are testing md readahead

634MB/s är snabbare än 1.6GB/s enligt scriptet.

Ja, scriptet jämför ju bara två flyttal, inga tiopotenser. För att få det rätt måste man titta på $WRUN och multiplicera $WRSP med 1024 om $WRUN = "GB/s".

Något åt det här hållet, placeras mellan rad 73 och 74:

if [[ $WRUN1 == "GB/s" ]]; then WRSP1=`echo "$WRSP * 1024;" | bc` WRUN1="MB/s" fi

(Med sedvanlig reservation för felaktig syntax osv...)

Visa signatur

Det finns bara två sorters hårddiskar: de som har gått sönder och de som skall gå sönder.

Permalänk
Medlem
Skrivet av zarkov:

Ja, scriptet jämför ju bara två flyttal, inga tiopotenser. För att få det rätt måste man titta på $WRUN och multiplicera $WRSP med 1024 om $WRUN = "GB/s".

Något åt det här hållet, placeras mellan rad 73 och 74:

if [[ $WRUN1 == "GB/s" ]]; then WRSP1=`echo "$WRSP * 1024;" | bc` WRUN1="MB/s" fi

(Med sedvanlig reservation för felaktig syntax osv...)

Ja det gick nästan
Fick detta felmeddelande
.(standard_in) 1: syntax error

Detta är när den gör lästest och där är hastigheten över 1GB/s

Permalänk
Medlem
Skrivet av Superthug:

Ja det gick nästan
Fick detta felmeddelande
.(standard_in) 1: syntax error

Detta är när den gör lästest och där är hastigheten över 1GB/s

Prova att ta bort alla mellanslag runt * och |, vissa versioner av shell är känsligare än andra. Funkar inte det får du lägga in ett echo mellan varje rad i if-sasten för att ta reda på exakt var det ballar ur och ta det därifrån. Det kan hjälpa att göra ett extra script med bara variabler och if-satsen, då slipper du köra alla tester varje gång du ändrat något.

Sen blir det väldigt mycket lättare att hjälpa dig om du lägger upp den ändrade koden och inte bara felmeddelandet.

Skickades från m.sweclockers.com

Visa signatur

Det finns bara två sorters hårddiskar: de som har gått sönder och de som skall gå sönder.

Permalänk
Medlem
Skrivet av zarkov:

Prova att ta bort alla mellanslag runt * och |, vissa versioner av shell är känsligare än andra. Funkar inte det får du lägga in ett echo mellan varje rad i if-sasten för att ta reda på exakt var det ballar ur och ta det därifrån. Det kan hjälpa att göra ett extra script med bara variabler och if-satsen, då slipper du köra alla tester varje gång du ändrat något.

Sen blir det väldigt mycket lättare att hjälpa dig om du lägger upp den ändrade koden och inte bara felmeddelandet.

Skickades från m.sweclockers.com

Så här ser det ut nu.
Scriptet kör första 3 skrivtesterna vilka går bra utan fel dock är hastigheten här alltid i MB/s
Sen direkt efter första läsningen failar den (hastighet GB/s)

... average write is 313.00 MB/s
found new best write - old: 313.00 new: 313.00
found new worst write - old: 313.00 new: 313.00
.before calc
(standard_in) 1: syntax error
efter calc

set RDUN1 done
MB/s

if [ $RDUN1 != "MB/s" ];
then
echo "before calc"
RDSP1=`echo "$RDSP*1024;"|bc` <--- detta syntax verkar fel
echo "efter calc"
echo $RDSP1 <---- Här får vi inget resultat på grund av tidigare syntaxfel
RDUN1="MB/s"
echo "set RDUN1 done"
echo $RDUN1 <--- den översätter GB/s till MB/s korrekt
fi

Permalänk
Medlem

Kan du få beräkningen att fungera i terminalen? Vad händer om du kör (tryck på enter efter varje rad):

RDSP=5 RDSP1=`echo "$RDSP*1024;"|bc` echo $RDSP1

Vad kör du för Linux-dist och version? Som jag sagt tidigare så skiljer sig olika shell lite från varandra när de tolkar kod.

Visa signatur

Det finns bara två sorters hårddiskar: de som har gått sönder och de som skall gå sönder.

Permalänk
Medlem

Följande script fungerar för mig i Ubuntu 18.04:

#!/bin/bash WRUN1="GB/s" WRSP=2 if [[ $WRUN1 == "GB/s" ]]; then WRSP1=`echo "$WRSP*1024;" | bc` WRUN1="MB/s" echo $WRSP1 $WRUN1 else echo $WRSP $WRUN1 fi

Visa signatur

Det finns bara två sorters hårddiskar: de som har gått sönder och de som skall gå sönder.

Permalänk
Medlem
Skrivet av zarkov:

Följande script fungerar för mig i Ubuntu 18.04:

#!/bin/bash WRUN1="GB/s" WRSP=2 if [[ $WRUN1 == "GB/s" ]]; then WRSP1=`echo "$WRSP*1024;" | bc` WRUN1="MB/s" echo $WRSP1 $WRUN1 else echo $WRSP $WRUN1 fi

Hittade felet. Så här ser koden ut nu och det fungerar.

echo -n .
hdparm -f /dev/sd[$DEVS] > /dev/null
READ1=`dd if=$MNT/testfile1.out of=/dev/null bs=100kB count=100000 2>&1 | grep copied`
RDUN1=`echo $READ1 | awk ' { print ( $(NF) ) }'`
RDSP1=`echo $READ1 | awk ' { print ( $(NF-1) ) }'`
if [ $RDUN1 != "MB/s" ];
then
RDSP1=`echo "$RDSP1 * 1024;" | bc`
RDUN1="MB/s"
fi

Permalänk
Medlem

Har du lust att dela med dig av det hela fungerande skriptet?

Permalänk
Medlem

Jag uppdaterade skriptet lite, https://pastebin.com/MyZVzeqV
Jag skapade case satser för att stödja fler hastigheter än MB/s.
Men jag har inte testat skriptet själv och jag misstänker att jag skrivit fel någonstans...

Så skriv gärna i tråden om ni testar och huruvida det fungerar eller ej.

Visa signatur

Desktop 386 16/SX, 16MB RAM, 160MB Quantum HDD, 3,5" HD FDD, Colorful Soundblaster 16 Compatible, DOS 6.22/Windows 3.11, AOC 14" VGA skärm (Skiftar mot gul tills man slår till den rätt), Keytronic tangentbord, 2 knappars mus