无意苦争春,一任群芳妒!M1 Mac book(Apple Silicon)能否支撑全栈工程师的日常?(Python3/Ruby/PHP/Mysql/Redis/NPM/虚拟机/Docker)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 就像大航海时代里突然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:“不好意思,虽然你也玩桌面芯片,但是,从今天开始,游戏就已经结束了,X86?还是省省吧。
就像大航海时代里突然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:“不好意思,虽然你也玩桌面芯片,但是,从今天开始,游戏就已经结束了,X86?还是省省吧。”

十五年前,iPhone横空出世,乔布斯告诉世人什么才叫做真正的智能手机,十年前,A4处理器粉墨出场,iPhone瞬间猛虎添翼,性能这两个字从此没有友商敢在苹果面前提及,iPad更是在业界呼风唤雨,几乎把整个平板市场都收入囊中,在人们的脑海中,Pad就是iPad的代名词,安卓平板?不存在的。今时今日,Apple Silicon华丽登台,不必说M1堪称恐怖到爆炸的性能,也不必说十个小时以上的超长续航以及丝滑无迟滞的FCPX极速剪辑体验,单是通过Rosetta 2 虚拟运行X86应用,就已经足以让人感到惊艳了。然而,这些福利只是苹果对于产品级用户的馈赠,作为一名开发者,而且是全栈(全干)开发,M1能否应对繁复的开发环境?就像一位研发同事说的那样:“Hi,哥儿们,你不会花一万大洋买了个ipad+秒控键盘吧?这智商税有点贵啊”。

首先是Python3的开发环境,python官网已经释出适配M1芯片的3.9版本,https://www.python.org/downloads/release/python-392/ ,但其实目前生态和市场占有率最高的还是3.7,笔者是通过迁移助理将老mac book pro里的开发环境(x86)直接迁移过来的,也就是迁移了原电脑的python3.7.4,令人意外的是,通过Rosetta 2,大部分的基础库都可以使用,除了首次运行稍显迟滞以外:

liuyue:~ liuyue$ python3  
Python 3.7.4 (v3.7.4:e09359112e, Jul  8 2019, 14:54:52)   
[Clang 6.0 (clang-600.0.57)] on darwin  
Type "help", "copyright", "credits" or "license" for more information.  
>>> import pandas  
>>> import cv2  
>>> import numpy  
>>> import matplotlib  
>>> import nltk  
>>> import ssl  
>>> from nltk.stem.lancaster import LancasterStemmer

但是一些深度学习框架比如TensorFlow就不行了,解决方案还是得从官网下载适配M1的3.9版本,然后再下载支持M1芯片的Tensorflow2.4,下载链接:https://link.zhihu.com/?target=https%3A//www.cyberlight.xyz/static/file/download\_and\_install.sh,换句话说,想用TensorFlow训练模型你就得升级python版本,可是很多TensorFlow项目都是和Web应用结合使用的,如果单独为了TensorFlow升级python,就需要将原来的项目分开部署,接口也得重构,尤其一些“祖传项目”就更不好弄了,这无疑提高了开发者的开发成本。

再来说说测试,自动化测试工具selenium是我们经常使用的工具之一,使用场景非常广泛,但是在M1系统里面我们通过Rosetta 2虚拟的python3.7能否控制arm64版本的chrome呢?答案是可以的,因为chromedriver已经对M1芯片进行了适配,下载驱动,注意要选择m1版本的驱动,随后解压,将chromedriver文件拷贝到系统目录中:

sudo mv chromedriver /usr/local/bin

随后启动浏览器:

from selenium import webdriver  
import time  
  
  
#selenium 截图  
driver = webdriver.Chrome()  
driver.get('https://v3u.cn')  
time.sleep(3)
driver.close()

问题并不大,所以如果单纯用M1 Mac用来写自动化测试脚本或者爬虫不会有太大压力,但是,如果涉及科学计算的结果测试,可能就得折腾一下了。

再聊聊虚拟机,虚拟机无论是测试岗还是运维岗基本都会用到,因为有些应用在Win和Mac系统中展示出的效果不尽相同,目前虚拟机两大巨头Vmware和Parallels都在加紧适配,Parallels领先一步,首先释出了兼容M1芯片的测试版虚拟机,不过需要先注册获取注册码:https://b2b.parallels.com/apple-silicon

随后在该页面下载安装包进行安装即可,需要注意的一点是,注册的时候一定要记录一下注册码,否则安装成功后没有码进行激活就尴尬了。

与此同时微软也适时的发布了基于arm内核的win10测试版镜像,下载地址:https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64 当然了,因为一些众所周知的学术问题,导致下载速度不尽如人意,笔者已经将安装包和镜像上传网盘,在文章底部会贴出来。

安装好Parallels以后,将arm版win10镜像导入即可安装,只需要5分钟左右就可以安装成功:

虽然是测试版,但是整体上运行起来非常行云流水,别忘了在系统内添加中文默认语言包:

在M1 Mac中玩虚拟机,几乎没有迟滞感,顺滑的令人咋舌,风扇纹丝不动,且能耗也并没有显著增加,续航也没有因为虚拟机的出现而减少太多,这是M1非常惊艳的一点。

想要用Mac做开发,包管理工具Homebrew是无法绕过的一环,所以如果你是通过迁移助理把老的x86架构的直接迁移到M1的mac中,那么最好别用了,会出很多问题,解决方案就是安装 arm版的Homebrew

执行安装命令:

/bin/bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"

基于arm的Homebrew统一安装在系统的/opt/homebrew目录,主要是为了和老版的x86区别开。

随后添加环境变量:

echo export PATH=/opt/homebrew/bin:$PATH >> ~/.bash_profile   
source ~/.bash_profile

接着执行:

liuyue:~ liuyue$ brew update  
Already up-to-date.  
liuyue:~ liuyue$

如果返回Already up-to-date.就没问题了,基本上目前Homebrew大概有7成左右的软件支持M1芯片,具体适配列表可以参照:https://github.com/Homebrew/brew/issues/7857

可以看到,像数据库如mysql、redis都进行了适配,mysql还有一些小bug,介意的同学可以考虑Rosetta,下面我们来看看用arm版的Homebrew来安装reids的流程:

安装命令:

brew install redis

一般brew会获取最新稳定版,安装成功后,查看软件列表:

liuyue:~ liuyue$ brew list  
openssl@1.1    redis  
liuyue:~ liuyue$

此时启动服务:

liuyue:bin liuyue$ redis-server  
36148:C 24 Feb 2021 21:13:48.673 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo  
36148:C 24 Feb 2021 21:13:48.673 # Redis version=6.2.0, bits=64, commit=00000000, modified=0, pid=36148, just started  
36148:C 24 Feb 2021 21:13:48.673 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf  
36148:M 24 Feb 2021 21:13:48.673 * Increased maximum number of open files to 10032 (it was originally set to 256).  
36148:M 24 Feb 2021 21:13:48.673 * monotonic clock: POSIX clock_gettime  
                _._                                                    
           _.-``__ ''-._                                               
      _.-``    `.  `_.  ''-._           Redis 6.2.0 (00000000/0) 64 bit  
  .-`` .-```.  ```\/    _.,_ ''-._                                     
 (    '      ,       .-`  | `,    )     Running in standalone mode  
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379  
 |    `-._   `._    /     _.-'    |     PID: 36148  
  `-._    `-._  `-./  _.-'    _.-'                                     
 |`-._`-._    `-.__.-'    _.-'_.-'|                                    
 |    `-._`-._        _.-'_.-'    |           http://redis.io          
  `-._    `-._`-.__.-'_.-'    _.-'                                     
 |`-._`-._    `-.__.-'    _.-'_.-'|                                    
 |    `-._`-._        _.-'_.-'    |                                    
  `-._    `-._`-.__.-'_.-'    _.-'                                     
      `-._    `-.__.-'    _.-'                                         
          `-._        _.-'                                             
              `-.__.-'

然后开启另一个命令行连接服务:

liuyue:~ liuyue$ redis-cli  
127.0.0.1:6379> ping  
PONG  
127.0.0.1:6379>

可以看到和x86的brew用起来没有区别,只不过上面的软件或多或少有些bug,用起来要小心。

如果你觉得arm版的brew速度过慢,可以单独设置国内源:

git -C "$(brew --repo)" remote set-url origin https://mirrors.ustc.edu.cn/brew.git  
  
  
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git  
  
  
git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git  
  
  
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile  
source ~/.bash_profile

中科大的镜像稍微靠谱一点。

有同学说,那还有三成的软件怎么搞?另外看起来arm的brew并不打算适配老版本软件,比如python3.7,其实在M1 的mac系统也可以装一版x86的brew,安装 x86 的 Homebrew:

arch -x86_64 /bin/bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"

装好之后,它还是在原来的/usr/local/bin/brew里面,这样就和/opt/homebrew/bin/brew 区分开了

执行命令:



liuyue:~ liuyue$ /usr/local/bin/brew list  
autoconf    gmp        libtool        openssl@1.1    siege  
automake    icu4c        libyaml        perl        sqlite  
boost        isl        lua        pkg-config    thrift  
coreutils    libevent    mkcert        python@3.8    trash  
gcc        libgpg-error    mpfr        readline    xz  
gdbm        libksba        mtr        redis        yarn  
gettext        libmpc        node        ruby        zlib

可以看到这些都是我从老的x86电脑中迁移过来的软件,大部分都用不了,比如redis,而基于arm的brew安装的新redis是可以使用的:

liuyue:~ liuyue$ /opt/homebrew/bin/brew list  
openssl@1.1    redis

所以用M1 mac做开发,就有点分裂,新软件包记住用/opt/homebrew/bin/brew,老的用:/usr/local/bin/brew

接着来看看Docker,Docker官方对于M1的适配还是很重视的,早些时候放出来一个测试版客户端:https://docs.docker.com/docker-for-mac/apple-m1/

不仅可以拉取arm版的镜像,也可以操作Kubernetes,对于Kubernetes不熟悉的同学可以参照这篇文章:一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群

不过令人遗憾的是,Docker Hub 支持 arm 版本的镜像并不多,大抵在x86镜像的三、四成左右,但是可以看出来各大厂商对于M1都是比较看重的,基本上官方都有适配的消息流出。

对于其他的语言来说,比如 go lang、ruby、以及php等,都有一个和python一样的通病,就是老版本不支持arm内核,只适配了最近的一个或者两个版本,这样也导致如果你换电脑的话,就得考虑向下兼容性问题。

对于一些常用的开发软件,比如vscode 和 sublime 3 都可以正常运行,php套件xampp运行无障碍,版本控制客户端SourceTree、数据库客户端Navicat、微信、QQ、SSH客户端iTerm 4以及Ftp客户端FileZilla都可以正常运行,前端微信小程序开发工具还是会有几率闪退,腾讯一开始对big sur就适配的不好,M1就更别提了。

值得一提的是,设计软件Photoshop最新版2021暂时还不支持M1芯片,只能凑合先用2019版的,与之形成对比的就是FCPX10.5的完美表现,看来还是亲儿子给力,Adobe还得加把劲了。

综上,如果您是一个初学者,只是想学习一些语言的基础语法,没打算写一些复杂工业级项目,可以考虑入手M1,它将会是您入门的好帮手,但是如果您在业内已经混迹多年,经常编译一些复杂代码、各种库,甚至手里还有一些“祖传代码”项目在维护,那么x86的Mac可能还得陪您一两年。

结语:有时候,当我们称赞一项技术的时候,我们会称其为这样或者那样的行业标杆、教科书之类,但是对于M1的Mac book来说,它好像已经超越了所谓的标杆,而成为了跨越时代的不朽经典。苹果作为业内完美的六边形战士,还依然在探索,依然没有裹足不前,继续探索新的道路,继续钻研可行性,这是它带给我们的启示,然而,在2021年的这个春天里,面对开发者,M1芯片有点像悲情的俄尔普斯,它能用动人的绕梁琴声打动开发者们,却在最后一秒钟忍不住回眸,断送挽救爱妻欧莉蒂克的最后机会,很明显,它已经足够努力,但是还差那么一点点,就差一点了,但是我相信,神明早已在M1的命格中写下四个字:注定辉煌。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
8天前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
66 24
|
9天前
|
NoSQL 算法 Redis
docker高级篇(大厂进阶):安装redis集群
docker高级篇(大厂进阶):安装redis集群
61 24
|
16天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
89 26
|
2天前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
58 7
|
17天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
117 15
|
1月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
67 14
|
1月前
|
存储 NoSQL 关系型数据库
MySQL和Redis的区别
**MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
88 4
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
1月前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
198 1
|
1月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(13)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MYSQL日志之详解如何配置查看二进制、查询及慢查询日志;备份与恢复等具体详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
2024Mysql And Redis基础与进阶操作系列(13)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]