Hardware: Raspberry Pi

From Luky-Wiki
Jump to: navigation, search

Just few notes about Raspberry Pi ...

Power

According to details from RPi project voltage between 4.75 and 5.25 volts is fine. I personally preffer voltage between 4.80 and 5.00 volts. Voltage below 4.8 volts, can lead to instability of 3v3 regulator (RG2) (e.g. SoC power source) and connected equipment. Voltage above 5.00 (5.25) can shorten life of board and lead to problems with connected equipment. Voltage above 5.6V trip D17 over voltage protection diode. Make sure that connected USB hub (if any) is not back feeding power. It can cause serious problems as there is no protection on USB output ports.

If you are experiencing random USB device disconnects, repeating keys from keyboard or random reboots (hung) of board then there is something wrong with power source. I think USB charger as source was not so good decision as most of the chargers don't maintain stable voltage under load. This can lead to under voltage and cause stability problems. If you hit some of them, then try to measure voltage between test points or change power source.

My Raspberry Pi is running pretty stable with following power sources:

  • RASPBERRY PI PSU is only 1A PSU, so no "hungry" devices. I Have ADATA N005 64GB USB flash disk + receiver for air mouse connected and it is just fine.
  • STONTRONICS T5582DV Recomended for RPi2 and installation which require more current (e.g. many peripherals connected).

Boot configuration

Raspberry Pi don't have so called "BIOS" and it's configuration interface. Configuration of SoC is stored in /boot/config.txt. If you have problem with overscan or screen resolution then You can resolve it by modification of this file. For example I have one RPi connected to old television and this television don't use overscan only if output of RPi is in DMT / PC mode. My boot config for this RPi running Raspbmc is:

# default Raspbmc config
arm_freq=850
core_freq=375
force_turbo=1
gpu_mem_512=128
gpu_mem_256=112
disable_overscan=1
start_file=start_x.elf
fixup_file=fixup_x.dat
# My configuration:
# Set stdv mode to PAL (as used in Europe)
sdtv_mode=2
# Force the monitor to HDMI mode so that sound will be sent over HDMI cable
hdmi_drive=2
# Set monitor mode to DMT
hdmi_group=2
# Set monitor resolution to 1360x768  60Hz
hdmi_mode=39
# EOF

Note1: Default configuration as of 2014-08-12.

Note2: I removed "hdmi_ignore_cec_init=1". According to elinux.org this option is: Doesn't sent initial active source message. Avoids bringing (CEC enabled) TV out of standby and channel switch when rebooting. This can cause problems to several types of TVs. I know at least one which is ignoring CEC if there was no "active source" message. Best way to prevent wakeup of TV is to configure TV itself. If this is not possible then configuration can be set via XBMC gui (system -> settings -> system -> input devices -> peripherals). Disabling CEC init at SoC level may lead to CEC malfunction at all.

More details can be found on elinux.org in section RPi_config.

Licensed and enabled codecs

To reduce cost Raspberry Pi is shipped without license to MPEG2 and VC-1. Raspberry Pi core is different from regular PC-AT system so there is special command to check status and details. Command vcgencmd provide a lot of details about Broatcom SoC used by Raspberry Pi. Following for cycle show details about all codecs:

for codec in H264 MPG2 WVC1 MPG4 MJPG WMV9 ; do \
     echo -e "$codec:\t$(vcgencmd codec_enabled $codec)" ; \
done

This is output from RPi with no license installed. As expected MPEG2 and VC-1 is disabled:

H264:	H264=enabled
MPG2:	MPG2=disabled
WVC1:	WVC1=disabled
MPG4:	MPG4=enabled
MJPG:	MJPG=enabled
WMV9:	WMV9=disabled

I bought both codecs from RPi Store and it cost me only 4,48 EUR (6.11.2013). Link to RPi store is here. I received license for both codecs in about 3.5 hour. Pretty fast :o) Installation is simple. Just edit /boot/config.txt and insert received license in following format:

decode_MPG2=0x00000000
decode_WVC1=0x00000000

Now RPi need reboot. After boot up it should have all codecs enabled:

H264:	H264=enabled
MPG2:	MPG2=enabled
WVC1:	WVC1=enabled
MPG4:	MPG4=enabled
MJPG:	MJPG=enabled
WMV9:	WMV9=enabled

Temperature

I was trying to get clear answer "what is safe temperature" for Raspberry Pi and apparently there is no clear statement. From my findings safe temperature is up to 60C and shutdown temperature should be 70C. Although it looks like RPi can run up to 80C. Running close to this temperature can reduce board lifetime. Current temperature measured by SoC itself can be displayed by vcgencmd command or by direct read from /proc file system.

$ vcgencmd measure_temp
temp=54.1'C

FYI 1: original plastic case with ventilation opening in RPi logo is concentrating heat. Test show that this case cause board to head-up by 10C.

FYI 2: small "ram" heat sink don't change temperature too much especially if adhesive side is cheaper with significant thermal resistance. I tried several heat sinks and result was only 2 to 5 degree Celsius temperature drop.

FYI 3: My recommendation for case: EM-RasPI B+ by EMKO Case

Additional software

List of handy tools in case of manual configuration or simple debugging:

apt-get install screen strace htop nload traceroute mc ddrescue rsync \
        vim pydf ca-certificates lsscsi lsof collectl atop psmisc

FS cache

FS cache can store read only cache pages from NFS to speedup further reading of filesystem. I'll use it to reduce network load. Configuration is following:

My cache disk (usb key) is /dev/sda. First of all I created partition over whole disk.

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048   123535359    61766656   83  Linux

Then file system:

mkfs.ext4 -m 0 -O dir_index -L fscache /dev/sda1
tune2fs -o user_xattr /dev/sda1

Reserve for root is not necessary (so 0%). If your cache is filling up to more that 95% then try to modify configuration or increase reserve. Using last 5% of free space can cause significant impact on response time. (Tested on 64GB filesystem).

Note: apparently journal on device is required by kernel driver. Without it registering of cache fail with strange error.

Cache coherency information is stored inside extra attributes on file system. Therefore it is necessary to mount it in following way (/etc/fstab):

# <fs>          <mountpoint>            <type>  <opts>                            <dump/pass>
LABEL=fscache   /var/cache/fscache      ext4    defaults,noatime,user_xattr           0 2

Note: I am not sure why but by default raspbmc is is skipping fsck during boot. Correction in fstab don't help as script for fsck is not invoked at all during boot-up.

Mount of file system itself:

mkdir -p /var/cache/fscache
mount /var/cache/fscache

Now fs cache daemon installation:

apt-get install cachefilesd

By default is is disabled. To enable it use modify /etc/default/cachefilesd:

RUN=yes

Configuration of daemon should point to mounted file system (config file: /etc/cachefilesd.conf):

dir /var/cache/fscache
tag mycache
brun 10%
bcull 7%
bstop 3%
frun 10%
fcull 7%
fstop 3%

If yes then it is time to start daemon:

/etc/init.d/cachefilesd start

Successful start is indicated by message:

[ ok ] Starting FilesCache daemon : cachefilesd.

and entry in kernel log:

FS-Cache: Cache "mycache" added (type cachefiles)
CacheFiles: File cache on sda1 registered

Now NFS mounted with "fsc" option will store cached data also into "files" (v2/3 only RO pages). Preferably whole file system should be mounted as "ro".

Results

For test I selected remote NFS server (max 10Mbit/s, ~35 ms latency). Maximum throughput during first read was approximately 7.33 Mbit/s and average at 5.00 Mbit/s (measured by nload). Reading of ~700 MB file took 1108.6 seconds.

702+1 records in
702+1 records out
736593920 bytes (737 MB) copied, 1108.6 s, 664 kB/s

Second reading show significant improvement. First of all there was no noticeable network activity and reading of same file took only 33.04 seconds.

702+1 records in
702+1 records out
736593920 bytes (737 MB) copied, 33.0383 s, 22.3 MB/s

Note: speed approximately at 22.3 MB/s is limitation of Raspberry Pi USB2 controler.

NFS vs. CIFS

There are two possibilities how to mount remote file system. NFS or SMB/CIFS. If i compare both protocols then i can say: if possible then use NFS. SMB/CIFS is working also, but this protocol require more CPU, access is less "Unix like" and under same condition CIFS use more bandwidth in both directions. Usable throughput is lower compared to NFS. On regular system this is normally not noticeable, but RPi have limited resources. Therefore use NFS, if it is possible and don't expect too much if you are using CIFS.

I am using following NFS mount options:

ro,fg,hard,tcp,vers=3,ac,nolock,fsc
  • ro - media PC is "consumer" of data so read only is enough. This also ensure that all cache pages are marked as R/O therefore cached locally by FS-Cache
  • fg - foreground mount is by default. In case of problem sooner or later mount command fail on timeout. I prefer visible error message during boot-up in case of problem.
  • hard - most of the applications don't react correctly on errors from VFS. It is safer to let NFS client retry till NFS server respond. Anyway media PC can't work without connection to "source" of data.
  • vers=3 - NFS protocol version. Version 3 is still preferred but if server support version 4 then you can try if it works better (I don't recommend version 2)
  • ac - cache file attributes on client. It is not expected that source for media PC change too quickly so it is safe to cache attributes locally
  • nolock - don't use remote locking. Lock daemon is not necessary in this configuration and locking files on RO mount don't make sense.
  • fsc - enable the FS-Cache

NFS client try to negotiate maximum read/write size during mount of file system. It should select optimal value automatically. Result of negotiation is not visible via mount as this command read /etc/mtab file. To see real value it is necessary to check /proc/mounts which contain in kernel data. If negotiated size is not at least 32K then try to raise this value with following additional mount options (and also check server configuration):

rsize=32768,wsize=32768

Note: media PC read data sequentially. Therefore higher value can be better (64K, 128K ... NFS Client on Linux support size up to 1M)

NTP

All my devices are synchronized agains my Stratum 2 NTP server. This server will be Stratum 1 NTP server soon. With this change I make it also available for public use. For now I share only configuration of client (/etc/ntp.conf):

# Name of the servers ntpd should sync with

# <server hostname> (local clock hub)
server <server IP>

# local failback in case of network failure
server 127.127.1.0

# you should not need to modify the following paths
driftfile       /var/lib/ntp/ntp.drift
logfile         /var/log/ntp.log

# restriction config
restrict default       nomodify notrap nopeer

# EOF

Note: you should select and put IP of NTP server(servers) in this configuration.

Uptime contest

If you whould like to "log" maximum uptime of your RPi then there is good program. It is called uptimed. Installation is simple:

apt-get install uptimed

Usage also (installed recently):

pi@raspbmc:~$ uprecords
     #               Uptime | System                                     Boot up
----------------------------+---------------------------------------------------
     1     0 days, 00:28:16 | Linux 3.10.17             Tue Nov 12 09:24:06 2013
->   2     0 days, 00:02:20 | Linux 3.10.17             Tue Nov 12 09:52:31 2013
     3     0 days, 00:01:21 | Linux 3.10.17             Tue Nov 12 09:52:10 2013
----------------------------+---------------------------------------------------
no1 in     0 days, 00:25:57 | at                        Tue Nov 12 10:20:47 2013
    up     0 days, 00:31:57 | since                     Tue Nov 12 09:24:06 2013
  down   0 days, 00:-01:-12 | since                     Tue Nov 12 09:24:06 2013
   %up              103.902 | since                     Tue Nov 12 09:24:06 2013
pi@raspbmc:~$

Note: looks like there is still bug in this package. If NTP change time/date significantly (during boot or if synchronization is not stable) then this software detect it as new boot entry. This may lead to duplicate entries shortly after boot or several entries covering one uptime. If you notice this behavior then check your time synchronization and/or internet connection.

SD Card speed

Raspberry Pi use connection which allow only "Class 10" connection to SD Card. This is limiting maximum throughput to SD Card and is source of differed kind of discussion. Which card is better for Raspberry Pi ? I saw responses "Class 4", also "Class 10 is enought" and then "UHS-I Ultimate".

I did test in past but unfortunately I don't preserve test output details :( So no numbers but at least details:

  • Class 4 -> Throughput limited by card to 4MB/s. Random operations show poor results mostly likely due to throughput limitation.
  • Class 10 -> Throughput limited by card to 10MB/s. Random operations show average results. With size of IO it was getting better.
  • UHS-I Ultimate -> Throughput limited by RPi. Random operations show good result regardles of size of IO. I think this may be due to internal "IO capacity" of SD Card.

Note 1: Above test is specific to first version of Raspberry Pi. RPi2 don't have such a limitation on SD Card connection (I see 65MB/s of write and 154MB/s of read on my RPi2 with UHS-I Ultimate SD Card).

Note 2: I use only Kingston SD Cards.

Troubleshooting

Network

  • Problem: dmesg contain a lot of smsc95xx 1-1.1:1.0 eth0: kevent 2 may have been dropped and/or allocation failures.
  • Solution: If you are not running latest firmware then update firmware first. If message remain then try to disable turbo mode by adding smsc95xx.turbo_mode=N to /boot/cmdline.txt. Additionally you may try to change vm.min_free_kbytes to 4096 or up to 16384 (/etc/sysctl.conf).