USB-portin/muistitikun nopeus on epämääräinen asia vaikka sille on helppo antaa tarkka arvo joka saattaa olla suurinpiirtein oikeakin mutta kertoo vain mittauskoneen senhetkisen tilanteen. Lisäksi pitää ottaa huomioon että vaikka portti/muistitikku on teoriassa USB2 tai USB3 niin esimerkiksi USB2.1:stä puhutaan USB2:tena vaikka esimerkiksi tiedonsiirtonopeus voi olla yli kaksinkertainen.
Tämä skripti mittaa sen USB-muistin/muistitikun nopeuden mikä on viimeiseksi laitettu mihintahansa USB-porttiin; siis voi verrata mikä tikun nopeus on eri porteissa olivatpa ne tyypiltään USB1.1, USB2 tai USB3. Tai mikä on eri tikkujen nopeus samassa portissa. Tai mikä on tiedostojärjestelmän vaikutus nopeuteen. Tulokset saavat tosiaan miettimään.
Skripti suorittaa mittauksensa mitattavan suurimmalta osoiolta, joten EFI- ja swap-osioita ei mitata vaikka mitattavalta sellaiset löytyisivätkin. Mitattavan tiedostojärjestelmän tyypin voi määrätä alustamalla tikun siihen muotoon.
Kirjoitusnopeus mitataan tulostamalla muistitikulle tiedosto. Usein kirjoitusnopeus mitataan kopioimalla, mutta silloin saadaan kopiointinopeus mikä on noin 5-10% pienempi kuin kirjoitusnopeus. Kuinkahan moni kaupallinen ohjelma mittaa kopiointinopeuden?
Lukunopeus mitataan tulostamalla tiedosto maton alle elikä tyhjyyteen.
Luotettavimman tuntuiset arvot saadaan kun tiedosto on iso, esimerkiksi 1.1GB. Perättäisissä mittauksissa saadaan hieman erilaisia tuloksia - mutta normaalistikin tiedonsiirto vaihtelee yhtäpaljon.
Linux:issa kaikki levytoiminta kulkee varsinkin kirjoitettaessa cache:jen ja buffereiden kautta ja niistä tulee huolehtia etteivät ne pääsisi sotkemaan mittaustuloksia: sillä kirjoitus suuntautuu normaalistikin aina buffereihin ja käyttöjärjestelmä tyhjentää buffereitansa levylle omaan tahtiinsa - joskus parin minuutinkin kuluttua buffereissa on vielä jotakin mikäli niitä ei erikseen käsketä tyhjentymään.
- kun mitataan siirtonopeuksia kopioimalla käsin niin on helpointa käyttää nautilusta joka osaa hoitaa nuo cachet ja bufferit mutta ei osaa tulostaa itse vaan surittaa mittauksensa kopioimalla. Ja cp tai jonkin sellaisen käskyn kanssa on sama vaje sen lisäksi että joutuu itse huolehtimaan cacheista, buffereista, luku- ja kirjoitusoikeuksista, kopioitavan olemassaolosta ...
- mittaus sopii myös sata-levyille kunhan muuttaa lauseessa 2: usb:n ata:ksi . Mutta sata-levyjen hot-swap ominaisuus riippuu BIOS:sista jossa saattaa joutua laittamaan AHCI:n päälle tai määräämään sata hot-swap:pableksi tai ...
- vaikka päivitänkin uuden koodin vanhalle paikalle niin ketjun jokainen viesti on tarkkaan luettu ja otettu opiksi.
#!/bin/bash
ViimeiseksiLiitettyLevy=$(sudo ls -l /dev/disk/by-id | sort -r --key=8 | grep usb | grep -om 1 sd.$)
SenSuurinOsio=$(lsblk -m | grep -v ^sd | grep $ViimeiseksiLiitettyLevy | sort -r --key=2 | head -1 | awk '{print $1}' | grep -o sd.*) # nimenomaan välttää EFI-osiota
echo 'viimeiseksi järjestelmään liitetyn USB-muistin laitenimi: '$ViimeiseksiLiitettyLevy' ja sen suurin osio: '$SenSuurinOsio' tiedostotyyppi: '$(sudo blkid -o value -s TYPE /dev/$SenSuurinOsio)
echo 'sen todellinen nimi:'$(ls -l /dev/disk/by-id | grep $ViimeiseksiLiitettyLevy$ | awk '{print $9}')
echo 'sen laiteportti on tyyppiä: '$(sudo lsusb -v | grep -A 5 $(dmesg | grep Manufacturer: | awk 'END{print $5}') | awk '/bcdUSB/{print $2}')
sudo mount -t auto /dev/$SenSuurinOsio /mnt
sudo chown $USER:$USER /mnt # eipä lupia kannata kysellä kun useimmat eivät välitä koko käyttö-oikeus asiasta
echo ' ' > /mnt/koetiedosto ; chmod u+rw /mnt/koetiedosto
echo;echo 'mennään mittaamaan nopeuksia ja se saattaa kestää minuutinkin';echo
sync # jos buffereissa on vielä jotakin muiden tehtävien hommia pakotetaan ne ensin pois mittausta sotkemasta
Alkuhetki=$(date +%s.%N)
seq -s vapaavalintainenteksti 1 5000000 > /mnt/koetiedosto
sync # tämä kirjoittaa levylle cachesta kaiken joka on uudempaa kuin levyllä jo oleva.
sudo sh -c "$(which echo) 3 > /proc/sys/vm/drop_caches" # tämä tyhjentää bufferit. tuloksen voi tarkistaa käskyllä: free -m .
# drop-caches:ille ei voi palauttaa arvoa 0, mutta silti niitä buffereita täytetään heti uudestaan kuten voit tarkistaa lukemalla levyltä jotakin ja tulostamalla: free -m.
Loppuhetki=$(date +%s.%N)
tiedostonkoko=$(echo $(stat -c%s /mnt/koetiedosto)*8/1000000 | bc -l); echo 'tiedostonkoko megabittiä: '$tiedostonkoko
aikasekunteina=$(echo $Loppuhetki-$Alkuhetki | bc -l); echo 'Aika sekunteina: '$aikasekunteina
tiedonsiirronnopeus=$(echo $tiedostonkoko'/'$aikasekunteina | bc -l)
echo 'kirjoitusnopeus megabittiä sekunnissa (tuolle muistitikulle siinä portissa kun se on) = '$tiedonsiirronnopeus
echo
sync
sudo sh -c "$(which echo) 3 > /proc/sys/vm/drop_caches"
Alkuhetki=$(date +%s.%N)
cat /mnt/koetiedosto > /dev/null
sync
Loppuhetki=$(date +%s.%N)
tiedostonkoko=$(echo $(stat -c%s /mnt/koetiedosto)*8/1000000 | bc -l); echo 'tiedostonkoko megabittiä: '$tiedostonkoko
aikasekunteina=$(echo $Loppuhetki-$Alkuhetki | bc -l); echo 'Aika sekunteina: '$aikasekunteina
tiedonsiirronnopeus=$(echo $tiedostonkoko'/'$aikasekunteina | bc -l)
echo 'lukunopeus megabittiä sekunnissa (tuolta muistitikulta siinä portissa kun se on) = '$tiedonsiirronnopeus
rm /mnt/koetiedosto
sudo umount /mnt