After many months of delays due to Intel not mass-producing Gemini Lake processors, Hardkernel started selling ODROID-H2 again, more exactly ODROID-H2 Rev. B, and the end of last month, and the company sent me a full kit for evaluation. You can check out ODROID-H Rev. B with Type 3 case and the assembly instructions in the first part of the review.
I’ve now had time to play with the board using the pre-installed Ubuntu 19.04 operating systems so I’ll report my experience in this second part. Note that ODROID-H2 does not rely on a custom version of Ubuntu, and instead you can download and flash Ubuntu 18.04 or 19.04 ISO directly from Ubuntu website.
First Boot and System Information
I had already connected two SATA drives inside the enclosure, one SSD and one HDD, but before booting the device I connected an HDMI cable, one Ethernet cable, USB keyboard & mouse, as well as the power supply. The board booted automatically when I connected the power supply the first time, but later one, you’ll need to press the power button to start it up. I mention this, as while Hardkernel told me they’d add the LED power button to be placed in the round hole shown in the top photo, I was unable to find it in the package. That means I had to use a pair of tweezers to press the small power push button on the board itself.
But apart from this small detail, everything works well. I also run the usual upgrade command to make sure I had the very latest version of the OS:
1 2 |
sudo apt update sudo apt dist-upgrade |
You can check out the full boot log, as well some system information below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
odroid@ODROID-H2:~$ uname -a Linux ODROID-H2 5.0.0-20-generic #21-Ubuntu SMP Mon Jun 24 09:32:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux odroid@ODROID-H2:~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=19.04 DISTRIB_CODENAME=disco DISTRIB_DESCRIPTION="Ubuntu 19.04" odroid@ODROID-H2:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 3.8G 0 3.8G 0% /dev tmpfs 780M 1.7M 778M 1% /run /dev/mmcblk0p2 29G 7.7G 19G 29% / tmpfs 3.9G 69M 3.8G 2% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/loop1 1.0M 1.0M 0 100% /snap/gnome-logs/61 /dev/loop0 3.8M 3.8M 0 100% /snap/gnome-system-monitor/77 /dev/loop2 3.8M 3.8M 0 100% /snap/gnome-system-monitor/95 /dev/loop3 55M 55M 0 100% /snap/core18/1049 /dev/loop4 150M 150M 0 100% /snap/gnome-3-28-1804/63 /dev/loop6 36M 36M 0 100% /snap/gtk-common-themes/1198 /dev/loop7 54M 54M 0 100% /snap/core18/941 /dev/loop5 15M 15M 0 100% /snap/gnome-characters/292 /dev/loop8 152M 152M 0 100% /snap/gnome-3-28-1804/31 /dev/loop9 90M 90M 0 100% /snap/core/6673 /dev/loop10 4.2M 4.2M 0 100% /snap/gnome-calculator/406 /dev/loop11 89M 89M 0 100% /snap/core/7270 /dev/loop12 15M 15M 0 100% /snap/gnome-characters/254 /dev/mmcblk0p1 511M 7.6M 504M 2% /boot/efi tmpfs 780M 28K 780M 1% /run/user/1000 odroid@ODROID-H2:~$ free -mh total used free shared buff/cache available Mem: 7.6Gi 1.5Gi 4.4Gi 290Mi 1.7Gi 5.5Gi Swap: 1.3Gi 0B 1.3Gi |
Ubuntu 19.04 with Linux 5.0, the 32GB eMMC flash has a root partition with 19GB free, and 7.6GB RAM is detected with 1.3 GB swap enabled as well. Some people may consider enabling ZRAM for better performance in case your system swaps often.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
sudo inxi -Fc0 System: Host: ODROID-H2 Kernel: 5.0.0-20-generic x86_64 bits: 64 Console: tty 0 Distro: Ubuntu 19.04 (Disco Dingo) Machine: Type: Desktop Mobo: HARDKERNEL model: ODROID-H2 v: 1.0 serial: N/A UEFI: American Megatrends v: 5.13 date: 05/10/2019 CPU: Topology: Quad Core model: Intel Celeron J4105 bits: 64 type: MCP L2 cache: 4096 KiB Speed: 1237 MHz min/max: 800/2500 MHz Core speeds (MHz): 1: 900 2: 873 3: 910 4: 971 Graphics: Device-1: Intel driver: i915 v: kernel Display: server: X.org 1.20.4 driver: i915 tty: 80x24 Message: Advanced graphics data unavailable in console for root. Audio: Device-1: Intel driver: snd_hda_intel Sound Server: ALSA v: k5.0.0-20-generic Network: Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 IF: enp2s0 state: up speed: 100 Mbps duplex: full mac: 00:1e:06:45:06:53 Device-2: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 IF: enp3s0 state: down mac: 00:1e:06:45:06:54 Drives: Local Storage: total: 1.05 TiB used: 7.58 GiB (0.7%) ID-1: /dev/mmcblk0 model: BJTD4R size: 29.12 GiB ID-2: /dev/sda model: CJ225128TC size: 118.00 GiB ID-3: /dev/sdb vendor: Toshiba model: MQ01ABD100 size: 931.51 GiB Partition: ID-1: / size: 28.04 GiB used: 7.58 GiB (27.0%) fs: ext4 dev: /dev/mmcblk0p2 Sensors: System Temperatures: cpu: 55.0 C mobo: N/A Fan Speeds (RPM): N/A Info: Processes: 229 Uptime: 1h 41m Memory: 7.61 GiB used: 1.62 GiB (21.3%) Init: systemd runlevel: 5 Shell: bash inxi: 3.0.33 |
The two internal SATA drives and their partition are properly detected, but as we can see from the df command above they did not mount automatically.
1 2 3 4 |
mount | grep /sd /dev/sda1 on /media/odroid/724DFD887D78427F type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,uhelper=udisks2) /dev/sda2 on /media/odroid/a788fe70-2382-4ceb-86c6-ac1d4ca8cfe9 type ext4 (rw,nosuid,nodev,relatime,uhelper=udisks2) /dev/sdb1 on /media/odroid/DATA-Drive type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,uhelper=udisks2) |
So just launched DISKS to mount all three partition manually, and next time (meaning next reboot) they’d also just mount automatically. The photo below shows the eMMC flash module is detected as an SD card reader.
User Experience with ODROID-H2 Rev.B
As usual, I tested some of the supported features of Ubuntu 19.04 on the board to see how well it would work as a desktop machine:
- Multi-tasking – Launch Firefox, Thunderbird, LibreOffice Write and Gimp in sequence from a cold boot
- Web browsing with Firefox and Chromium – Opening multiple tabs, Youtube 1080p, 1440p, and 2160p (4K), Candy Crush Saga in Facebook, and WebGL demos: Quake + Aquarium
- H.264, H.265, and VP9 Video Playback in Kodi 18.3 and VLC from USB 3.0 hard drive
- Office applications – Open odt “word” file in LibreOffice, open large PDF (ODROID Magazine 2018) in Evince
With a fast eMMC flash and 8GB of memory, all four programs almost launched instantly, and multi-tab web browsing works very well. I installed h264ify plugin in Firefox because YouTube will default to VP9 which does not play smoothly. When I first tried I could play 1080p videos just fine with AVC, but while shooting the video review (see below) it was limited to 720p with AV1 codec only. I switched to Chrome without h264ify to show how 4K (2160p) videos would not play very smoothly. At 1440p resolution video playback is acceptable.
Candy Crush Saga took a while to load as usual, and audio cuts can be heard when a level is loading, but not such problem during playback. WebGL demos worked fine by at a rather low 12 to 15 fps. It’s still better than on most Arm platforms that often fail to load some WebGL demo due to the use of OpenGL ES instead of OpenGL on PC based hardware.
I played various 4K videos in VLC and they all played fine except some stuttering at the beginning, and 10-bit H.264 is not supported (black screen). This was done with video output set to 1080p60 however. So I switched to 3840×2160 resolution that is limited to 30 fps over HDMI. If you’d like 4K 60 fps, the DisplayPort output should work. I played the 4K videos again, and they were not very smooth. Later I noticed the display was automatically set back to 23.98 Hz, so that may explain since all tested videos were either 30 and 60 fps. I switched to Kodi 18.3 to see if I could get any improvement, and the results were equally disappointing. I set automatically rate switching in Kodi, but it did not seem to work. H.265, H.264, and VP9 videos were decoded with hardware video decoding in Kodi, so I suspect the main issue is the output frame rate, and going with DisplayPort should improve the results.
You can checkout by yourself in the video below.
ODROID-H2 Benchmarks
3D graphics
I’ve also run some benchmarks starting with glmark2 using 1920×1080 resolution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
glmark2 ======================================================= glmark2 2014.03+git20150611.fa71af2d ======================================================= OpenGL Information GL_VENDOR: Intel Open Source Technology Center GL_RENDERER: Mesa DRI Intel(R) UHD Graphics 600 (Geminilake 2x6) GL_VERSION: 3.0 Mesa 19.0.2 ======================================================= [build] use-vbo=false: FPS: 1560 FrameTime: 0.641 ms [build] use-vbo=true: FPS: 1637 FrameTime: 0.611 ms [texture] texture-filter=nearest: FPS: 1546 FrameTime: 0.647 ms [texture] texture-filter=linear: FPS: 1532 FrameTime: 0.653 ms [texture] texture-filter=mipmap: FPS: 1544 FrameTime: 0.648 ms [shading] shading=gouraud: FPS: 1230 FrameTime: 0.813 ms [shading] shading=blinn-phong-inf: FPS: 1234 FrameTime: 0.810 ms [shading] shading=phong: FPS: 1208 FrameTime: 0.828 ms [shading] shading=cel: FPS: 1203 FrameTime: 0.831 ms [bump] bump-render=high-poly: FPS: 958 FrameTime: 1.044 ms [bump] bump-render=normals: FPS: 1636 FrameTime: 0.611 ms [bump] bump-render=height: FPS: 1583 FrameTime: 0.632 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 1067 FrameTime: 0.937 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 561 FrameTime: 1.783 ms [pulsar] light=false:quads=5:texture=false: FPS: 1297 FrameTime: 0.771 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 545 FrameTime: 1.835 ms [desktop] effect=shadow:windows=4: FPS: 962 FrameTime: 1.040 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 617 FrameTime: 1.621 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 505 FrameTime: 1.980 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 704 FrameTime: 1.420 ms [ideas] speed=duration: FPS: 1083 FrameTime: 0.923 ms [jellyfish] <default>: FPS: 752 FrameTime: 1.330 ms [terrain] <default>: FPS: 103 FrameTime: 9.709 ms [shadow] <default>: FPS: 1023 FrameTime: 0.978 ms [refract] <default>: FPS: 176 FrameTime: 5.682 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 1207 FrameTime: 0.829 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 1219 FrameTime: 0.820 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 1203 FrameTime: 0.831 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 1219 FrameTime: 0.820 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 1240 FrameTime: 0.806 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 1220 FrameTime: 0.820 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 1215 FrameTime: 0.823 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 1236 FrameTime: 0.809 ms ======================================================= glmark2 Score: 1091 ======================================================= |
ODROID-H2 got 1,091 points in glmark2. I’m not sure if this can be compared to glmark2-es2 scores I usually get on Arm platforms, and are highly variable depending on settings. For reference, an Nvidia Jetson TX2 board achieved 1,218 points on Ubuntu 16.04 at the same resolution (1920×1080) according to results posted on OpenBenchmarking.
SBC Bench
I then switched to sbc-bench that’s mostly useful for server workloads (as opposed to desktop workloads):
1 2 |
wget https://raw.githubusercontent.com/ThomasKaiser/sbc-bench/master/sbc-bench.sh sudo /bin/bash ./sbc-bench.sh -c |
I got some error messages while monitoring CPU frequency:
1 |
/home/odroid/sbc-bench.sh: line 180: /sys/devices/system/cpu/cpufreq/policy0/cpufreq/scaling_cur_freq: No such file or directory |
It turns out in Ubuntu 19.04 at least, /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq is expected instead, so I changed the code in line 180 of the script to remove “cpufreq/” from the string as a quick fix, and started the benchmark again:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
sbc-bench v0.6.7 Installing needed tools. This may take some time... Done. Checking cpufreq OPP... Done. Executing tinymembench. This will take a long time... Done. Executing OpenSSL benchmark. This will take 3 minutes... Done. Executing 7-zip benchmark. This will take a long time... Done. Executing cpuminer. This will take 5 minutes... Done. Checking cpufreq OPP... Done. Memory performance: memcpy: 5316.4 MB/s memset: 7001.2 MB/s (0.4%) Cpuminer total scores (5 minutes execution): 18.88,18.87,18.86,18.85,18.84,18.83,18.82,18.81,18.79,18.76 kH/s 7-zip total scores (3 consecutive runs): 8398,8445,8442 OpenSSL results: type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes-128-cbc 322757.32k 687215.55k 867034.28k 940509.53k 967210.33k 966896.30k aes-128-cbc 322009.69k 687838.93k 865825.11k 940798.63k 964225.71k 967092.91k aes-192-cbc 303336.73k 603481.39k 735460.61k 789580.12k 806917.46k 809260.37k aes-192-cbc 302952.69k 604931.39k 735684.01k 789985.28k 809088.34k 808938.15k aes-256-cbc 286240.75k 538138.99k 630548.48k 679576.23k 694332.07k 695025.66k aes-256-cbc 285497.47k 538924.54k 631544.15k 678960.47k 694831.79k 693452.80k Full results uploaded to http://ix.io/1O0O. Please check the log for anomalies (e.g. swapping or throttling happened) and otherwise share this URL. |
The numbers I got for ODROID-H2 are a little lower than the ones reported for the board in SBC Bench results page, despite no throttling being detected. Swap was used only 5MB, and %iowait was at 0.21, so I doubt it has much of an effect.
Beside checking out the performance, sbc-bench script is also very useful to monitor the temperature and frequency during operation. The most demanding task, cpuminer, made the processor go up to 84°C, or a little over 20°C from the junction temperature (105°C) of the Pentium J4150 processor. The heatsink does a good job of keeping everything cool, and the fan does not appear to be needed.
ODROID-H2 vs ODROID-XU4Q
I also repeated the other benchmarks I used for ODROID-XU4 review with Ubuntu 18.04. Both boards should serve different purposes, but since both are made by Hardkernel, and ODROID-H2 costs over twice as much I thought it’d be fun to compare the results to see if you’d get at least twice the performance.
While I built Linux for ODROID-XU4 natively in the board, I cross-compiled Linux for ODROID-XU4 in the EXT-4 partition of the SSD connected to ODROID-H2:
1 2 3 4 5 6 7 8 9 10 |
sudo apt install git gcc g++ build-essential libssl-dev gcc-arm-linux-gnueabi cd /media/odroid/a788fe70-2382-4ceb-86c6-ac1d4ca8cfe9 git clone --depth 1 https://github.com/hardkernel/linux -b odroidxu4-4.14.y cd linux make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- odroidxu4_defconfig time make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -j4 ... real 25m48.658s user 78m46.833s sys 8m20.175s |
Results for ODROID-XU4Q:
1 2 3 |
real 38m47.360s user 255m45.448s sys 23m35.780s |
It took 25 minutes and 48 seconds to cross-compile on ODROID-H2, while ODROID-XU4 did the same in 38 minutes and 47 seconds. Much faster, but not quite twice as fast. Note that the code base will have changed slightly since May 2018 when I did ODROID-XU4Q review.
I tested software transcoding with ffmpeg/avconv converting and MPEG4 video to H.264:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
time ffmpeg -i big_buck_bunny_1080p_MPEG4_MP3_25fps_7600K.AVI -vcodec libx264 -minrate 300k -maxrate 300k -bufsize 1835k bbb-h.264.avi ffmpeg version 4.1.3-0ubuntu1 Copyright (c) 2000-2019 the FFmpeg developers built with gcc 8 (Ubuntu 8.3.0-6ubuntu1) configuration: --prefix=/usr --extra-version=0ubuntu1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared libavutil 56. 22.100 / 56. 22.100 libavcodec 58. 35.100 / 58. 35.100 libavformat 58. 20.100 / 58. 20.100 libavdevice 58. 5.100 / 58. 5.100 libavfilter 7. 40.101 / 7. 40.101 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 3.100 / 5. 3.100 libswresample 3. 3.100 / 3. 3.100 libpostproc 55. 3.100 / 55. 3.100 Input #0, avi, from 'big_buck_bunny_1080p_MPEG4_MP3_25fps_7600K.AVI': Metadata: encoder : SUPER(C) - by eRightSoft artist : created.with.SUPER(C).v2011.bld.49 Duration: 00:00:44.88, start: 0.000000, bitrate: 7746 kb/s Stream #0:0: Video: mpeg4 (Simple Profile) (MP4V / 0x5634504D), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 7634 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, fltp, 112 kb/s Stream mapping: Stream #0:0 -> #0:0 (mpeg4 (native) -> h264 (libx264)) Stream #0:1 -> #0:1 (mp3 (mp3float) -> mp3 (libmp3lame)) Press [q] to stop, [?] for help [libx264 @ 0x55b1884b9b80] using SAR=1/1 [libx264 @ 0x55b1884b9b80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 [libx264 @ 0x55b1884b9b80] profile High, level 4.0 Output #0, avi, to 'bbb-h.264.avi': Metadata: IART : created.with.SUPER(C).v2011.bld.49 ISFT : Lavf58.20.100 Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 25 fps, 25 tbn, 25 tbc Metadata: encoder : Lavc58.35.100 libx264 Side data: cpb: bitrate max/min/avg: 300000/0/0 buffer size: 1835000 vbv_delay: -1 Stream #0:1: Audio: mp3 (libmp3lame) (U[0][0][0] / 0x0055), 44100 Hz, stereo, fltp Metadata: encoder : Lavc58.35.100 libmp3lame frame= 35 fps=0.0 q=0.0 size= 10kB time=00:00:01.93 bitrate= 41.6kbits/sframe= 46 fps= 28 q=0.0 size= 10kB time=00:00:02.40 bitrate= 33.4kbits/sframe= 58 fps= 27 q=46.0 size= 10kB time=00:00:02.87 bitrate= 28.0kbits/frame= 73 fps= 27 q=51.0 size= 10kB time=00:00:03.47 bitrate= 23.1kbits/frame= 88 fps= 28 q=51.0 size= 10kB time=00:00:04.07 bitrate= 19.7kbits/frame= 107 fps= 29 q=50.0 size= 10kB time=00:00:04.88 bitrate= 16.4kbits/frame= 123 fps= 29 q=45.0 size= 10kB time=00:00:05.51 bitrate= 14.6kbits/frame= 139 fps= 29 q=46.0 size= 266kB time=00:00:06.16 bitrate= 353.2kbits/frame= 152 fps= 29 q=46.0 size= 266kB time=00:00:06.71 bitrate= 324.3kbits/frame= 168 fps= 29 q=55.0 size= 266kB time=00:00:07.39 bitrate= 294.5kbits/frame= 183 fps= 29 q=57.0 size= 266kB time=00:00:07.99 bitrate= 272.4kbits/frame= 202 fps= 30 q=52.0 size= 266kB time=00:00:08.80 bitrate= 247.3kbits/frame= 219 fps= 30 q=54.0 size= 266kB time=00:00:09.50 bitrate= 229.0kbits/frame= 239 fps= 31 q=53.0 size= 266kB time=00:00:10.31 bitrate= 211.0kbits/frame= 252 fps= 30 q=50.0 size= 522kB time=00:00:10.86 bitrate= 393.4kbits/frame= 268 fps= 30 q=55.0 size= 522kB time=00:00:11.54 bitrate= 370.2kbits/frame= 279 fps= 30 q=46.0 size= 522kB time=00:00:11.99 bitrate= 356.5kbits/frame= 295 fps= 30 q=47.0 size= 522kB time=00:00:12.66 bitrate= 337.4kbits/frame= 308 fps= 29 q=50.0 size= 522kB time=00:00:13.19 bitrate= 324.0kbits/frame= 322 fps= 29 q=46.0 size= 522kB time=00:00:13.79 bitrate= 309.9kbits/frame= 338 fps= 29 q=50.0 size= 522kB time=00:00:14.47 bitrate= 295.4kbits/frame= 356 fps= 29 q=48.0 size= 522kB time=00:00:15.20 bitrate= 281.2kbits/frame= 379 fps= 30 q=40.0 size= 778kB time=00:00:16.14 bitrate= 394.7kbits/frame= 402 fps= 31 q=39.0 size= 778kB time=00:00:17.11 bitrate= 372.4kbits/frame= 425 fps= 31 q=43.0 size= 778kB time=00:00:18.07 bitrate= 352.5kbits/frame= 446 fps= 32 q=44.0 size= 778kB time=00:00:18.96 bitrate= 336.0kbits/frame= 467 fps= 32 q=40.0 size= 778kB time=00:00:19.82 bitrate= 321.4kbits/frame= 488 fps= 32 q=37.0 size= 1034kB time=00:00:20.71 bitrate= 408.8kbits/frame= 510 fps= 32 q=37.0 size= 1034kB time=00:00:21.62 bitrate= 391.5kbits/frame= 530 fps= 33 q=41.0 size= 1034kB time=00:00:22.46 bitrate= 377.0kbits/frame= 544 fps= 32 q=42.0 size= 1034kB time=00:00:23.04 bitrate= 367.6kbits/frame= 559 fps= 32 q=52.0 size= 1034kB time=00:00:23.66 bitrate= 357.8kbits/frame= 573 fps= 32 q=56.0 size= 1034kB time=00:00:24.24 bitrate= 349.4kbits/frame= 584 fps= 32 q=61.0 size= 1034kB time=00:00:24.71 bitrate= 342.7kbits/frame= 602 fps= 32 q=64.0 size= 1290kB time=00:00:25.46 bitrate= 414.9kbits/frame= 617 fps= 32 q=60.0 size= 1290kB time=00:00:26.07 bitrate= 405.3kbits/frame= 637 fps= 32 q=58.0 size= 1290kB time=00:00:26.90 bitrate= 392.7kbits/frame= 653 fps= 32 q=52.0 size= 1290kB time=00:00:27.58 bitrate= 383.0kbits/frame= 664 fps= 32 q=48.0 size= 1290kB time=00:00:28.02 bitrate= 377.0kbits/frame= 679 fps= 32 q=51.0 size= 1290kB time=00:00:28.68 bitrate= 368.4kbits/frame= 697 fps= 32 q=48.0 size= 1290kB time=00:00:29.44 bitrate= 358.9kbits/frame= 703 fps= 31 q=42.0 size= 1290kB time=00:00:29.67 bitrate= 356.1kbits/frame= 723 fps= 31 q=44.0 size= 1546kB time=00:00:30.51 bitrate= 415.0kbits/frame= 740 fps= 31 q=45.0 size= 1546kB time=00:00:31.19 bitrate= 406.0kbits/frame= 752 fps= 31 q=49.0 size= 1546kB time=00:00:31.71 bitrate= 399.3kbits/frame= 769 fps= 31 q=55.0 size= 1546kB time=00:00:32.44 bitrate= 390.3kbits/frame= 784 fps= 31 q=48.0 size= 1546kB time=00:00:33.04 bitrate= 383.2kbits/frame= 799 fps= 31 q=50.0 size= 1546kB time=00:00:33.64 bitrate= 376.4kbits/frame= 813 fps= 31 q=53.0 size= 1546kB time=00:00:34.24 bitrate= 369.8kbits/frame= 832 fps= 31 q=50.0 size= 1802kB time=00:00:35.03 bitrate= 421.4kbits/frame= 852 fps= 31 q=48.0 size= 1802kB time=00:00:35.86 bitrate= 411.5kbits/frame= 874 fps= 31 q=49.0 size= 1802kB time=00:00:36.80 bitrate= 401.0kbits/frame= 892 fps= 31 q=51.0 size= 1802kB time=00:00:37.53 bitrate= 393.2kbits/frame= 911 fps= 31 q=50.0 size= 1802kB time=00:00:38.34 bitrate= 384.9kbits/frame= 925 fps= 31 q=55.0 size= 1802kB time=00:00:38.92 bitrate= 379.2kbits/frame= 942 fps= 31 q=57.0 size= 2058kB time=00:00:39.62 bitrate= 425.4kbits/frame= 961 fps= 32 q=48.0 size= 2058kB time=00:00:40.43 bitrate= 416.9kbits/frame= 979 fps= 32 q=54.0 size= 2058kB time=00:00:41.14 bitrate= 409.7kbits/frame= 994 fps= 32 q=52.0 size= 2058kB time=00:00:41.79 bitrate= 403.3kbits/frame= 1011 fps= 32 q=56.0 size= 2058kB time=00:00:42.52 bitrate= 396.4kbits/frame= 1026 fps= 31 q=53.0 size= 2058kB time=00:00:43.10 bitrate= 391.1kbits/frame= 1039 fps= 31 q=57.0 size= 2058kB time=00:00:43.67 bitrate= 386.0kbits/frame= 1051 fps= 31 q=61.0 size= 2058kB time=00:00:44.14 bitrate= 381.9kbits/frame= 1063 fps= 31 q=61.0 size= 2314kB time=00:00:44.66 bitrate= 424.3kbits/frame= 1076 fps= 31 q=64.0 size= 2314kB time=00:00:44.82 bitrate= 422.8kbits/frame= 1081 fps= 30 q=-1.0 Lsize= 2516kB time=00:00:44.93 bitrate= 458.7kbits/s speed=1.24x video:1736kB audio:702kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 3.162242% [libx264 @ 0x55b1884b9b80] frame I:14 Avg QP:40.40 size: 20398 [libx264 @ 0x55b1884b9b80] frame P:805 Avg QP:44.21 size: 1666 [libx264 @ 0x55b1884b9b80] frame B:262 Avg QP:42.34 size: 578 [libx264 @ 0x55b1884b9b80] consecutive B-frames: 62.5% 12.8% 8.0% 16.7% [libx264 @ 0x55b1884b9b80] mb I I16..4: 31.0% 67.0% 2.1% [libx264 @ 0x55b1884b9b80] mb P I16..4: 2.5% 2.6% 0.0% P16..4: 6.2% 0.2% 0.7% 0.0% 0.0% skip:87.9% [libx264 @ 0x55b1884b9b80] mb B I16..4: 0.2% 0.3% 0.0% B16..8: 3.8% 0.1% 0.0% direct: 0.1% skip:95.5% L0:36.4% L1:63.0% BI: 0.6% [libx264 @ 0x55b1884b9b80] 8x8 transform intra:55.4% inter:91.2% [libx264 @ 0x55b1884b9b80] coded y,uvDC,uvAC intra: 7.7% 24.0% 1.9% inter: 0.5% 0.9% 0.0% [libx264 @ 0x55b1884b9b80] i16 v,h,dc,p: 50% 28% 6% 16% [libx264 @ 0x55b1884b9b80] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 6% 73% 1% 1% 1% 1% 1% 1% [libx264 @ 0x55b1884b9b80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 38% 16% 14% 5% 5% 8% 5% 7% 3% [libx264 @ 0x55b1884b9b80] i8c dc,h,v,p: 91% 4% 4% 0% [libx264 @ 0x55b1884b9b80] Weighted P-Frames: Y:1.6% UV:1.6% [libx264 @ 0x55b1884b9b80] ref P L0: 75.9% 5.7% 13.2% 5.1% 0.0% [libx264 @ 0x55b1884b9b80] ref B L0: 78.0% 18.3% 3.7% [libx264 @ 0x55b1884b9b80] ref B L1: 95.4% 4.6% [libx264 @ 0x55b1884b9b80] kb/s:317.18 real 0m36.952s user 1m54.453s sys 0m1.043s |
ODROID-H2 took 36.952 seconds to complete the tasks, while ODROID-XU4Q did so in 1m34.676s. Advanced SSE & AVX instructions on the Intel processor likely helped a lot here. Also note the video is 45 seconds long, so Celeron J4105 SBC can handle real-time Full HD transcoding, while the Exynos 5422 board cannot.
Storage Benchmarks
I installed iozone to evaluate storage performance:
1 |
sudo apt install iozone3 |
Starting with the 32GB eMMC flash module:
1 2 3 4 5 6 7 8 9 |
sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 42609 48264 29986 30082 30242 44366 102400 16 97654 104939 80457 79336 78519 102608 102400 512 107436 108153 263109 264037 266641 107580 102400 1024 107988 108123 278223 282883 282744 108130 102400 16384 108056 108012 321248 323122 321730 108313 |
Around 321 MB/s sequential read, 108 MB/s sequential write, and excellent random I/O numbers as well.
I then tested the 120GB CHUANG JIU SSD that I got with CubieTruck kit, and connected over SATA (EXT-4 partition):
1 2 3 4 5 6 7 8 |
sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 17187 23333 40007 40728 10093 971 102400 16 62348 62490 108545 111024 36944 2659 102400 512 32083 145493 230365 234401 215259 67038 102400 1024 152705 148457 230761 234960 222372 70854 102400 16384 152131 26173 242689 248811 247075 107358 |
While not outstanding, read (242MB/s) and writes (152 MB/s) speeds are OK with the limiting factor likely being the cheap SSD here. For some reasons, rewrites are awful with 16K. Again, no issues with random I/O.
Finally, I checked the USB 3.0 hard drive to checkout nothing bad happened over USB 3.0 using the EXT-4 partition (sequential read/write only):
1 2 3 4 5 6 7 8 |
sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 21572 28665 27230 27278 102400 16 74176 78618 73279 74835 102400 512 91501 93239 94668 96978 102400 1024 92395 92321 96151 97566 102400 16384 91824 93500 92948 96118 |
About 91MB/s write and 92 MB/s which is roughly what I’d expect from this mechanical drive.
Ethernet
If you’ve checked out the kernel log output much earlier in the post, you’ll see Ethernet connected at 100Mbps Ethernet. That because I have several Ethernet cables that are only good for 100Mbps. After changing the Ethernet cable to a better one, I had no troubles and got a proper Gigabit Ethernet connection.
- Full duplex with iperf2:
1 2 3 4 5 6 7 |
Client connecting to 192.168.1.12, TCP port 5001 TCP window size: 340 KByte (default) ------------------------------------------------------------ [ 6] local 192.168.1.4 port 36136 connected with 192.168.1.12 port 5001 [ ID] Interval Transfer Bandwidth [ 4] 0.0-60.0 sec 6.11 GBytes 874 Mbits/sec [ 6] 0.0-60.0 sec 5.84 GBytes 835 Mbits/sec |
Excellent, one of the best result I’ve ever gotten with this test.
- Download:
1 2 3 |
[ 4] local 192.168.1.12 port 5001 connected with 192.168.1.4 port 36646 [ ID] Interval Transfer Bandwidth [ 4] 0.0-60.0 sec 6.58 GBytes 941 Mbits/sec |
- Upload:
1 2 |
[ 4] local 192.168.1.4 port 5001 connected with 192.168.1.12 port 58218 [ 4] 0.0-60.0 sec 6.57 GBytes 940 Mbits/sec |
Gigabit Ethernet just works as it should.
A look at I/Os and RTC
Many Intel SBCs do not expose any I/O header for expansion at all, but ODROID-H2 does better in that respect with a 20-pin connector exposing several I2C and UART ports. There’s also an option 16-port GPIO extender that connects to I2C.
I don’t have the latter, but I just quickly had a look at I2C by installing I2C tools:
1 |
sudo apt install i2c-tools |
We can run the following command line to find out more.
1 2 3 4 5 6 7 8 9 10 |
i2cdetect -l i2c-3 unknown Synopsys DesignWare I2C adapter N/A i2c-1 unknown Synopsys DesignWare I2C adapter N/A i2c-8 unknown DPDDC-B N/A i2c-6 unknown i915 gmbus dpc N/A i2c-4 unknown Synopsys DesignWare I2C adapter N/A i2c-2 unknown Synopsys DesignWare I2C adapter N/A i2c-0 unknown SMBus I801 adapter at f040 N/A i2c-7 unknown i915 gmbus misc N/A i2c-5 unknown i915 gmbus dpb N/A |
The user-accessible I2C interfaces are on port 5 and 6, and properly detected.
It’s also possible to use UART. I haven’t done it due to time contraints, but as explained in the wiki, you could send commands over /dev/ttyS0 or /dev/ttyS1 devices, as well as use RTS/CTS pins as GPIOs.
My kit included an RTC battery as well, so I ran the usual hwclock command to make sure I could read the time from the RTC:
1 2 3 |
sudo hwclock [sudo] password for odroid: 2019-07-14 16:10:43.052581+07:00 |
I also disconnect the Ethernet in order to remove any connection to the Internet and rebooted the board. The time and date were still correct, as one would expect from any PC hardware.
Final words
Overall I’m satisfied with my experience with ODROID-H2 running Ubuntu 19.04, most things I tested worked well, and performance was roughly as expected for a Gemini Lake platform. Cooling works well with the larger heatsink provided and I did not experience any throttling. HDMI is limited to 4K @ 30 Hz, so depending on your video library it may not be suitable as a 4K HTPC [Update August 2019: ODROID-H2 is supposed to support 4K @ 60 Hz over HDMI, so I suspect an incompatiblity with my TV. See comment]. DisplayPort should support 4K @ 60Hz however.
Hardkernel does not customize the software for the board, meaning you can just download and install ISO from Ubuntu or other Linux distribution website. You could also install Windows 10 if you please, so in a sense, it’s just like any Gemini Lake mini PC. The advantages of ODROID-H2 are mostly in terms of support with the Wiki, community forum, and the many accessories that allow you to customize your board. For example, the Type 3 case I received makes it a good platform for a simple NAS with two 2.5″ SATA drives and could be used as a gateway/firewall/router thanks to the two Gigabit Ethernet ports and USB expansions available.
Price is also affordable, with the kit I received going for $215.70 plus shipping. This included the $111 SBC, 8GB DDR4 memory, a 32GB eMMC flash, 15V/4A power supply, Type 3 enclosure, SATA cables, RTC battery, and the fan. As mentioned in the post, you’ll likely want to add $4.90 to get the LED power button to you order, unless you’re fine with booting it up with a toothpick or a pair of tweezers.
ODROID-H2 and its accessories can be purchased directly on Hardkernel, or one of the distributors such as Ameridroid. I’ll take the opportunity to remind readers that we have a few coupons for Ameridroid, including CNXSUPPORTER10 that will shave off $10 of purchases, meaning ODROID-H2 can be had for $101.95.
Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress
I got two from the first batch. Replaced two espressobins I had for routing, NFS, apt cache, gitolite etc.. Other than the in-kernel driver for the realtek ethernet not playing well with interface bonding and needing to be replaced with the vendor dkms packaged one they’ve been perfect since day one.
sbc-bench detailed output reported several ‘hardware errors’ via
dmesg
. It might be worth a try to do the following, repeat the benchmark and then look what appeared in/var/log/mcelog
:mcelog is gone: https://bugs.launchpad.net/ubuntu/+source/mcelog/+bug/1752251
“Debian removed the package because they disabled kernel support, Ubuntu removed the package because Debian did”
“The mcelog package functionality has been replaced by rasdaemon. Best to focus on rasdaemon.”
Started the daemon manually:
Wiki: https://wiki.archlinux.org/index.php/Machine-check_exception
I’m not sure how to go from here, I just ran some commands but nothing useful shown yet:
I’ll check a bit more later.
> mcelog is gone
Ouch, I wasn’t aware of this. That’s bad news for non server-grade x86 hardware: http://mcelog.org/manpage.html 🙁
> ras-mc-ctl: drivers not loaded
Well… from the launchpad link wrt mcelog: ‘Nevertheless I took the package from Xenial and installed on Bionic, nothing breaks dependencies’. Installing mcelog_128+dfsg-1_amd64.deb via
dpkg -I
might be worth a try…OK, I’ve install the package manually, and… nothing:
I still have those errors in dmesg though:
It seems to be corrected cache errors:
and details…
> I’ve install the package manually, and… nothing
No
/var/log/mcelog
now?Ah OK. I thought we were supposed to use the tools to decode whatever was in the log. I’ve got cache errors in /var/log/mcelog:
I’ve written a separate post about it: https://www.cnx-software.com/2019/07/17/machine-check-exception-mce-errors-linux/
Hardkernel just told me “the H2 HDMI port supports 4K/60Hz on Ubuntu as well as Windows.”
So I’m suspecting some incompatibility with my TV, possibly due to the YCbCr4:4:4 mode not supported by my TV as explained at https://www.cnx-software.com/2015/01/25/all-hdmi-2-0-implementations-are-not-equal/
Shouldn’t you perform an edit to the article about 4K @ 60fps over HDMI?
Yes. I was hoping Hardkernel would find a solution at the time, so I forgot about it, but edited the article accordingly today.
Ordered mine on AmeriDroid, it would have been good to know about the coupon. I did not expect H2 to perform well in video playback. I will use it as a server anyway. Nice review as always. Maybe you can test video playback on Windows 10, if you can. I doubt it will be significantly better.
Every time I see one of these things, I ask myself: where are the AMD counterparts, but I always remember: oh yeah they are very inefficient. This time I go further and check the AMD processor specifications list, and it was impossible to find a perfect match for the Celeron J4105, but to be fair there are 2 processors that almost mach the description: the FX-7500 and the A6-5200 they have a TDP of 20W and 25W, the thing is that they are made on a 28nm process which means if they were made on 14nm or 12nm maybe we would have a competition and that will be better for us.
But well what can I do, I just can dream about nice things.
Low power options are limited with AMD. You’ve got the AMD Ryzen V1000/R1000, but usually a bit more expensive, and for commercial applications (so hard to purchase for individual). One board that’s for hobbyist is UDOO BOLT: https://www.cnx-software.com/2018/06/01/udoo-bolt-amd-ryzen-embedded-v1000-sbc/
I’m running mint mate and having no problems with video. In the BIOS I set the southbridge to LINUX, and uped the ram to the video
to max. Makes everything fly
I completely disagree with you review and assessment of the H2 power I get flawless play back no mater the video and perfect performance when playing GameCube and Wii games with Dolphin. Maybe you problem is Ubuntu. I’ve found Ubuntu to be inferior to Mint. I run Mint mate and this machine is fast and smooth with only 8 gb of ram.
I’ve upgraded ODROID-H2 to Ubuntu 19.10, and I’ve lost HDMI audio. The device does not show up at all, only “Digital Output S/PDIF”. I’ll look into it.