很多人可能都有些废旧不用的手机,比如像我这只摔得坑坑洼洼连送人都送不出手,二手也卖不了几个钱的。但它们又不是完全不能用,其实功能都正常,性能也还可以。如何才能发挥它们的余热?
——做个人服务器就是一个不错的用途:功耗低,还自带ups。做个个人网站,个人云或下载机,7x24小时开机,不担心费电,也不担心停电。
最近在android手机上利用linux deploy搭建了一个lemp/lnmp网站,本文讲述其中的主要流程和注意事项。有一些坑,也有点小窍门,还有一些测试数据,拿手机做其它框架的网站或其它用途的服务器也可参考。
可行性及方案
先评估下性能。在手机上装了个linux,用sysbench测试下cpu,以pc和树莓派作为对比。
命令:
sysbench --test=cpu --cpu-max-prime=20000 run
结果是耗时,越短越好。
pc: i7 4770k: 21.2s华为荣耀6 plus: 247s树莓派3代: 535s树莓派2代: 1150s
虽然比pc差远了,但比树莓派快不少(多核应该更强)。其实我的网站以前是跑在树莓派2代上的。树莓派的i/o(sd卡)也是很慢的。
至于方案,理论上来说有这么几类:
apk提供) in guzzlehttp\handler\curlfactory::createrejection() (line 186 of /home/www/drupal-8.3.2/vendor/guzzlehttp/guzzle/src/handler/curlfactory.php).
从字面看,像是dns或是网络连接的问题。最后的答案和前面mysql启动不了是类似的:web server进程需要有internet访问的权限。
sudo usermod -a -g aid_inet www-data
发邮件也是网站必备的功能。通过php发邮件,web server同样需要internet的访问权限(比如连接smtp.gmail的587端口)。
性能测试及调优
wifi及网络速度
做服务器肯定是用有线网络好。但无线网络是否堪用呢?下面的测试都是在5g的wifi下,靠近路由器,小米mini一代。
用 ping 测试有线连接的树莓派和无线连接的手机。
可以看到,往返时间差了两个数量级。前者平均是0.72ms;后者差不多70ms。
下图是用 iperf 测试网络速度。大约是67mbps.
速度属于正常水平,对于自娱自乐的个人站点,也可接受吧。
数据库放在flash还是sd卡上?
先对文件系统做一简单的测试。用dd读写总共4gb(大于手机内存)的文件,每次读写不同大小的块。
#$count = $totalsize / $blksizedd if=/dev/zero of=$tmpfile bs=$blksize count=$count && sync of=/dev/zero if=$tmpfile bs=$blksize count=$count && sync
最后的结果如下图所示。
可以看到,写的速度差不多,读的速度flash还是比sd卡快不少。
还可以用sysbench测试mysql性能,或者用wget/curl直接测试网站的速度。总体上,对于这个手机(荣耀6 plus),后面这两项测试的结果差别不大。最后,我还是把数据库放在了内部flash上。
屏幕开还是关?
对于做服务器用途,想当然地会认为要把屏幕关掉。控制开关屏幕的有好几个地方:
“显示”里面的延时熄屏;“开发者选项”里的插电时保持屏幕活动;linux deploy界面里的保持屏幕活动。
在性能测试中发现,屏幕开着和关着的差别很大。
sysbench --test=cpu --cpu-max-prime=20000 run
屏幕开:247.5s屏幕关:441.0s
sysbench进行cpu测试的结果还是很稳定的,包括以前用linux deploy 2.0.0-215,现在用的2.0.2-220;开启mysql/nginx等服务或者不开启,分数波动在1%以内。可见,屏幕开和关的差距是非常显著的。
在android/linux系统里,还有一个cpu governor的策略会影响cpu的性能。
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
interactive
可以看到,默认的策略是interactive. 尝试把它改到性能最高的 performance,
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
测试结果也并没有差别。
也许是屏幕关着的时候,cpu被降频使用了?
最后,不得不选择让屏幕常开(当然,亮度调至最低)。
/proc/loadavg的问题
我们通常会用/proc/loadavg查看系统的load
cat /proc/loadavg
空闲时:5.16 5.14 5.17 1/1290 8877运行sysbench时:6.02 5.74 5.48 4/1295 9353
作为对比,树莓派的loadavg:
空闲时:0.03 0.07 0.02 2/159 28307运行sysbench时:1.03 0.72 0.33 3/158 28903
android系统的loadavg空闲时普遍都很高;而用top命令查看各进程的cpu占用率时,并没有多高。
关于这个问题,网上有一些讨论,但我还没找到权威的说法。总之,并不能用loadavg作为系统load的参考。
自动启动
在启动android系统时,自动启动容器内的linux,似乎并不起作用。
另一个层面的自动启动是自动启动linux系统内的服务。这需要在linux deploy里启用 init 系统,并选用类型 sysv.
这样,在linux系统启动时,runlevel(默认为3)中设置为自动启动的服务就会自动启动,像普通的linux那样。否则,连cron服务都要手动启动。
不过在我的手机上有个小问题:在启用了init后,stop linux时会导致android重启,然后root丢失。但再重启一次会恢复root。
备份
数据库本来是安装在flash上,可以将其备份到sd卡,这样起到了“两个篮子”的作用。
考虑到flash和sd卡都有可能突然失效(都曾经碰到过),远程备份也是必须的。
本想用nfs挂载nas上的目录的,但nfs client的安装有点问题。没有去深究,直接用了ssh密钥登录加rsync。命令示意:
rsync -auvax --delete $srcdir nas:/$dstdir
升级
升级包括3个层面:
android系统本身:取决于厂家是否还提供升级支持,升级后可能要重新root。总之是比较麻烦的。由于linux和android共用内核,除非出现内核级别的安全漏洞,否则没必要升级。linux系统:可以安装unattended-upgrades之类的包来自动更新。linux deploy:根据需要升级。升级前最好保存配置。直接缷载/安装会把原配置数据全部清除;不过只要把profile重新配置一下,就可以启动原系统 。所以也不是大问题。
功耗
用记录型万用表ut181a对电流进行24小时监测(手机电池始终是满电)。
每小时的平均电流在140~150ma之间,功耗相当于0.75w。
小米路由器的usb口实测电流可以超过200ma,所以可以直接用这个路由器的usb口给手机长期供电。
电源/电池状态
还可以通过读取目录 /sys/class/power_supply/battery 的文件来监控电源和电池的状态:
status:充放电状态;capacity: 电池容量百分比;charge_now:当前充电的容量(mah);charge_full:电池的总容量(mah);voltage_now:当前电池电压(v);voltage_max:电池充满电的电压(v);current_now:当前充电电流(ma),充电为正,放电为负;如果系统负载高,电流会是负值;temp:电池温度(有无爆炸隐患早知道)。
可以写几行脚本,直接在网站上显示这些状态。
结语
在root过的android手机上通过linux deploy安装linux,可以达到和普通linux一样的完整度和自由度。能灵活地在上面部署各种lamp, lemp/lnmp站点。而且,这样的“服务器”功耗低(小于1w),带“ups”(电池)。
主要的要注意的方面有:和android相关的权限问题,如何自动启动服务,熄屏对性能有无影响,等等。手机虽小,但跨越android, linux及容器,涉及系统的多方面,对技术爱好者也是一个很好的练习。
本文主要是从平台的角度来谈论“手机服务器”的,并不涉及平台上的应用(即具体如何建一个网站)。至于建网站的其它方面,后续会有文章。敬请关注。
参考
convert an android device to linux:http://linux-magazine/online/features/convert-an-android-device-to-linuxlinux deploy官方下载地址:https://github/meefik/linuxdeploy/releases一个运行在android手机上的网站:http://loblab.myvnc/