stenm官网

Steam官方网站是全球*大的数字游戏平台,拥有众多游戏发行商和数以百万计的玩家。

该网站提供了一系列丰富多样的数字游戏,涵盖了各种类型和风格。

玩家可以通过Steam购买、下载和安装游戏,并享受无缝的游戏体验。

Steam官方网站不仅仅是一个游戏商店,它还是一个巨大的数字游戏社区。

用户可以与其他玩家进行交流和互动,分享游戏心得和建议。

此外,网站还提供了许多社交功能,如好友系统、聊天室和论坛,让玩家们可以建立联系并一起玩游戏。

Steam官方网站的另一大特点是其丰富的活动和特惠销售。

用户可以参与各种促销活动,购买优惠的游戏和DLC(下载内容)。

每年的“Steam夏季特卖”和“Steam冬季特卖”更是备受期待,吸引了大量玩家。

总之,Steam官方网站是一个数字游戏乐园,为全球玩家带来了无穷的乐趣和机会。

无论你是游戏发行商还是玩家,它都值得一探究竟。

路由器不能上网如何解决

 

路由器不能上网的原因有很多,可以从以下几个方面进行排查:

  • 线路连接是否正常

首先要确认路由器的 WAN 口是否连接到宽带线路。如果连接正确,请检查 WAN 口指示灯是否亮。如果 WAN 口指示灯不亮,请检查线路是否连接牢固。

  • 路由器设置是否正确

如果线路连接正常,请检查路由器的设置是否正确。可以通过路由器的管理页面来检查设置。如果设置不正确,请按照路由器说明书进行修改。

  • 路由器是否损坏

如果线路连接和设置都正常,请检查路由器是否损坏。可以尝试将路由器恢复出厂设置,然后重新设置。如果恢复出厂设置后仍然无法上网,则可能是路由器损坏,需要联系路由器厂商进行维修。

以下是一些具体的排查步骤:

  1. 检查路由器和宽带线路的连接情况

确认路由器的 WAN 口是否连接到宽带线路。如果连接正确,请检查 WAN 口指示灯是否亮。如果 WAN 口指示灯不亮,请检查线路是否连接牢固。

  1. 检查路由器的设置

登录路由器的管理页面,检查路由器的设置是否正确。如果设置不正确,请按照路由器说明书进行修改。

  1. 检查路由器的连接状态

在路由器的管理页面,检查路由器的连接状态。如果连接状态显示正常,则可能是网络运营商的问题。

  1. 重启路由器

如果以上步骤都检查了,仍然无法解决问题,请尝试重启路由器。

  1. 恢复出厂设置

如果重启路由器后仍然无法解决问题,请尝试恢复出厂设置。恢复出厂设置会将路由器的所有设置重置为默认值。

如果您按照上述步骤仍然无法解决问题,请联系路由器厂商进行维修。

苹果路由器AirPort Express不能上网如何解决

苹果AirPort Express 不能上网的原因有很多,可以从以下几个方面进行排查:

  • 线路连接是否正常

首先要确认 AirPort Express 的 WAN 口是否连接到宽带线路。如果连接正确,请检查 WAN 口指示灯是否亮。如果 WAN 口指示灯不亮,请检查线路是否连接牢固。

  • AirPort Express 设置是否正确

如果线路连接正常,请检查 AirPort Express 的设置是否正确。可以通过 AirPort Express 的管理页面来检查设置。如果设置不正确,请按照说明书进行修改。

  • AirPort Express 是否损坏

如果线路连接和设置都正常,请检查 AirPort Express 是否损坏。可以尝试将 AirPort Express 恢复出厂设置,然后重新设置。如果恢复出厂设置后仍然无法上网,则可能是 AirPort Express 损坏,需要联系苹果官方进行维修。

以下是一些具体的排查步骤:

  1. 检查 AirPort Express 和宽带线路的连接情况

确认 AirPort Express 的 WAN 口是否连接到宽带线路。如果连接正确,请检查 WAN 口指示灯是否亮。如果 WAN 口指示灯不亮,请检查线路是否连接牢固。

  1. 检查 AirPort Express 的设置

登录 AirPort Express 的管理页面,检查 AirPort Express 的设置是否正确。如果设置不正确,请按照说明书进行修改。

  1. 检查 AirPort Express 的连接状态

在 AirPort Express 的管理页面,检查 AirPort Express 的连接状态。如果连接状态显示正常,则可能是网络运营商的问题。

  1. 重启 AirPort Express

如果以上步骤都检查了,仍然无法解决问题,请尝试重启 AirPort Express。

  1. 恢复 AirPort Express 出厂设置

如果重启 AirPort Express 后仍然无法解决问题,请尝试恢复 AirPort Express 出厂设置。恢复出厂设置会将 AirPort Express 的所有设置重置为默认值。

如果您按照上述步骤仍然无法解决问题,请联系苹果官方进行维修。

以下是一些针对苹果AirPort Express 的常见问题和解决方法:

  • AirPort Express 无法连接到无线网络

如果您无法连接到 AirPort Express 的无线网络,请检查以下内容:

* 您的设备是否支持 802.11ac 标准。
* 您的设备是否在 AirPort Express 的无线网络范围内。
* 您的设备是否正确输入了 AirPort Express 的无线网络密码。
  • AirPort Express 无法连接到互联网

如果您无法连接到互联网,请检查以下内容:

* 您的 AirPort Express 是否连接到宽带线路。
* 您的 AirPort Express 是否设置了正确的宽带帐户信息。
* 您的网络运营商是否有问题。
  • AirPort Express 无法访问某些网站或应用程序

如果您无法访问某些网站或应用程序,请检查以下内容:

* 您的设备是否有防火墙或代理设置。
* 您是否连接到 *。
* 您是否被网站或应用程序封锁。

以下是一些其他可能导致 AirPort Express 无法上网的问题:

  • AirPort Express 的软件版本过旧。
  • AirPort Express 的硬件损坏。
  • 您的网络运营商正在进行维护。

如果您尝试了上述所有方法仍然无法解决问题,请联系苹果官方进行维修。

有没有公司用 Python 或者 django 搭建集群、微服务成功的案例?

如果有的话请大佬帮忙讲讲怎么实现的:集群或者微服务都用到了什么,用什么做网关、服务之间怎么调用的。

随着公司业务发展,发现一台服务器上部署的项目满足不了需求,想把项目部署到多台服务器上,也想把其中一些业务独立出来解耦,数据库也想搞一个读写分离,现在毫无头绪;

集群 Python django 服务器20 条回复 • 2021-10-12 10:26:26 +08:00
homelab 1
homelab 1 天前
网关可以用 kong,可以用与认证、限流
服务之间用 rpc 调用,但你用 django 是 http 同步框架,只能走 http 相互调用吧
ruanimal 2
ruanimal 1 天前
目前就一台机器就想上集群,小心步子迈太大
676529483 3
676529483 1 天前
我现在用 k8s,相对简单,网关你看需要加,服务注册和负载均衡直接用 svc 和 ingress,用 django 的话就 http 呗。至于读写分离,做好主从同步,django 里配置多个数据库或者数据库路由就行
Ehco1996 4
Ehco1996 1 天前
其实业界已经有很标准的做法了,抄作业的*快办法就是

1 上云买云版本 k8s
2 容器化你们当前的服务
3 slb 直接打到 k8s 的 ingress controller

至于业务 /db 拆分 这就是写代码的事情了, 可以慢慢考虑

—-
但是,如果现在毫无头绪的话建议不要上来就集群微服务

单机性能有瓶颈了先上 nginx 后面拉几台机器负载均衡一下

等心里面有数了(有人力)之后再考虑上微服务集群那一套
arischow 5
arischow 1 天前 via iPhone
现在就一台服务器的单体要开始计划读写分离?需要补充更多语境
podel 6
podel 1 天前
我司就是。
要不要过来投个简历。偷师学艺一下吖~~~[手动滑稽]
主要 python 里面的计算逻辑尽量的少。
某些搜索分流到 ES 之类的。 频繁信息直接内存缓存或者 Redis 。*后数据库存储原始数据。
web 只做 web 的事情,不要做其他事情。
这样子 可以轻松的水平扩容。 (加 WEB POD 数量,加 ES 集群数量,升数据库配置。)
另外阿里云 SLB+ K8S + istio 的 service mesh(不需要可以不用) 轻轻松松水平扩展吖。
longmeier90 7
longmeier90 1 天前
@podel 大佬什么公司呀
longmeier90 8
longmeier90 1 天前
@arischow 是因为财务统计、运营统计数据量大的情况下 cpu 经常报警;想着是读和写分开这样的话可以分担压力
chengxiao 9
chengxiao 1 天前
v2 不就是么
hushao 10
hushao 1 天前
想半天,默默打出一个负载均衡???
gengchun 11
gengchun 1 天前
有 40 个核数以上吗?

看上去是传统的业务,都是物理机的可能性较大,估计后面只有 mysql/mariadb,再加上 redis 就差不多了。这样 100 个核两三台用不到什么集群。nginx + uwsgi 光是 Python 的话,什么都对付过去了。

做点内核参数调整就对付过去了。实在想的话,也就用一下 docker,用 ns 特性做点隔离就差不多了。

数据库读写分离都不需要。搞个主从备份下就好了。早年阿里的中间件现在都不维护了。maxscale 这种东西。复杂业务也要踩坑。

如果不是真心希望向运维方向发展的话,专注了解业务,不要在这上面浪费时间。
ch2 12
ch2 1 天前
先搞清楚无状态计算跟有状态计算再说吧
roundgis 13
roundgis 1 天前 via Android
@longmeier90 如果瓶頸在 db 和 django 關係不大
dayeye2006199 14
dayeye2006199 1 天前
我们在 aws 上的简单配置:
1. 多 EC2 实例部署 django 应用
2. 接个 ASG 保证 HA
3. *前面再接个 API gateway

LZ 的问题听者像是数据库瓶颈的问题。如果经常需要做大量数据统计和报表的功能,一个是考虑优化一下 query 的性能;一个是可以考虑设置定时任务预计算一些常用的报表;另一个是考虑上 OLAP 的数据库,例如我们的 OLTP 用的 postgre,OLAP 用的是相关的 greenplum
christopheredwar 15
christopheredwar 1 天前
同学习中
longmeier90 16
longmeier90 22 小时 53 分钟前
@dayeye2006199 大佬能不能详细说一下 ASG 是个什么东西,从来没听说过,API 网关用的是什么?负载用的什么策略,配置中心用了没有?
podel 17
podel 19 小时 46 分钟前
@longmeier90 一家小公司。只不过技术栈比较新啦。
公司信息[保护隐私,就不直接贴出来了] https://tttemp.oss-cn-shanghai.aliyuncs.com/current-company.txt
longmeier90 18
longmeier90 19 小时 20 分钟前
@podel 你要不要跳槽到俺们公司,眼科医疗行业,前景好、待遇高,加班少
younglinuxer786 20
younglinuxer786 2 小时 44 分钟前
1.看了下帖子,如果数据库和应用都在一台服务器上,先把数据独立放在一台服务器上(磁盘,cpu,men 这些搞好点)应该会好很多
2.如果只是想搞个集群问题不大,微服务要拆分业务太费时间 能保证每个应用下没有单独保存的数据,同时共用数据库 即可实现集群。多个应用之间可以使用 nginx 作为入口 负载到下面的多个应用… (当然这是比较传统的方式 也比较好理解)
3.你也可以考虑将应用打包成 docker 然后使用 k8s 来做集群 一个 pod 启动多个实例 使用 k8s 的 services 来做不同服务的负载 集群要方便管理点(满足第三点的前提)
4.读写分离考虑使用 mycat 或者其他数据库中间件对业务影响不大
5. 看了上面的帖子猜测是统计执行的 sql 造成数据压力有点大 建议先执行*条…

MIUI 的手机目前有啥推荐的吗? k30s 至尊纪念版、k40、还是即将要发布的 k40s?

看大家在用的有 k40 和 mi10s,我再看看
k40 k40s k30s MIUI129 条回复 • 2021-10-12 13:01:38 +08:00
1 2
2
❮ ❯
ioschina1 101
ioschina1 19 小时 22 分钟前
@archiyuan 应用双开不叫系统分身。
系统分身的功能可以参考 8848 的广告语:
一部手机,两个密码,两个空间,分别存储,互不干扰,8848 钛金手机。
生活才能会工作,8848 钛金手机,双密码,双空间,工作生活分别存储,互不干扰。

比如你如果拿个 8848,周围的人都会怀疑你手机里有很多小秘密,但是 MIUI 有 8848 宣传的卖点功能,你的小秘密只有你自己知道
jntitor 102
jntitor 19 小时 12 分钟前
看起来 civi 不错 其他的都太重了
lscexpress 103
lscexpress 19 小时 6 分钟前
选 k40,我手持小米 8 下部就换 k40,因为 888 处理器太拉胯了所以选择次旗舰。
daviddeng 104
daviddeng 19 小时 3 分钟前
@jdhao 个人感觉可以观望一下反馈,等 MIUI 反馈好点再买
user1121114685 105
user1121114685 18 小时 57 分钟前 via Android
只有我建议用 k40 游戏增强版吗? 1 可刷印度固件,2 电池大,3 充电快,4 信号好。5nfc 红外都有。而且天机 1200 性能也够用。简直日用强的一逼呀!
user1121114685 106
user1121114685 18 小时 55 分钟前 via Android
还有一点,解锁不用等 168 个小时。哈哈哈
Torpedo 107
Torpedo 18 小时 51 分钟前
10s,除了重,其他还好
Huelse 108
Huelse 18 小时 41 分钟前
k30s 至尊纪念版在用,一代神 u865+5000 毫安的电池,真的一充一天,有时候能用 2 天,不完游戏不看视频。好像只有线下还有货
archiyuan 109
archiyuan 18 小时 10 分钟前
@ioschina1 我什么时候说应用分身=系统分身了?
archiyuan 110
archiyuan 18 小时 9 分钟前
@user1121114685 刷印度固件有哪些优点啊?
yaojin 111
yaojin 18 小时 6 分钟前
为啥这么多人黑小米, 我觉得挺好用的啊, 经济实惠, 用的 k30pro, 满足日常使用, 现在二手也就 1000 多一点, 不像以前用 iphone 小心翼翼的使用, 现在手机摔了也不心疼, 哈哈, 喜欢 miui 的系统, 真的非常符合国人的使用, iphone 的系统的确好, 但是很多功能的设计都是考虑国外的用户习惯的, 不过 miui 的确有时候有点 bug, 但是不至于没法使用, 而且出现 bug 的几率很低, 不知道为啥这么多人黑, 特别是 B 站, 不知道是不是请的水军
FawkesV 112
FawkesV 18 小时 4 分钟前
@Huelse 就是太重了 我用的也是这个 其他的感觉啥都好 就是重
yeqizhang 113
yeqizhang 17 小时 35 分钟前 via Android
手持 k40 半年,感觉还行吧,12gb 用起来很爽。希望还能继续强势用上三年。
Linon 114
Linon 17 小时 1 分钟前 via Android
k30s
Awes0me 115
Awes0me 16 小时 58 分钟前
@user1121114685

为啥不用等 168 ?
Aaron01 116
Aaron01 16 小时 50 分钟前 via Android
k20pro 用了 2 年多了,没发现什么 bug
az22c 117
az22c 16 小时 45 分钟前
@Huelse 平时中午吃个饭 提个手机太重了
wenjiu 118
wenjiu 16 小时 22 分钟前
供参考:手上有台红米 10x 5g,miui12.5 将近半年多没推送新系统了,目前*新版本 wifi 断流严重(很多人有此 bug 而且都被反应烂了没人处理),官方论坛还有很多人反应别的各种小毛病,得不到处理。
目前百度上搜红米 10x 5g 依然只能搜到各种推荐,性价比之王,怀疑删评论严重。

不知道是因为不是旗舰机没人权还是因为各个机器体质不一样。
amirobotics 119
amirobotics 14 小时 52 分钟前 ❤️ 1
我曾经看到其他人投诉 MIUI bug,都认为是黑粉。

直到我遇到这些 miui bug 后才深刻体会。

比如 notification,

1. 老板通过 WhatsApp 催工作进度。
2. 老母亲通过短信慰问。
3. 各位大佬在 telegram 发讯息。

*后会看到一个通知是:“老板 whatsapp 的头像”+“老母亲的电话号码”+“telegram 的讯息”。

没错,whatsapp,telegram,message 的通知全都搞砸了,都混在一起,差不多 2 个月多的时间才要修复。真的非常影响体验,基本生活都搞砸了,分不清谁是谁。

此外,还有 notification bubble 的 bug,launcher 在 6 inch 的屏幕里,只能有 3 inch 的操作界面。

MIUI 广告那些的都是小问题,我能手动解决。但是那些 bug 的修复速度让我觉得,下一台电话不会是小米了。

*后想说,MIUI 有 bug,顶多影响体验。但雷军造车,刹车如果失灵,后果可是人命。MIUI 都做不好,还想造车?倒不如直接造宇宙飞船。
zpxshl 120
zpxshl 14 小时 33 分钟前 via Android ❤️ 1
@yaojin 为什么这么不喜欢小米呢。119 楼就是一个例子。你没遇到的问题不代表别人没遇到,正常反馈问题总被怀疑是水军或者黑粉。
就这质量还怀疑被水军黑,真是相当自信。 就 miui 这质量,几年前就 bug 满天飞了,反馈渠道还失灵。
tanranran 121
tanranran 14 小时 23 分钟前
有一说一,多年 MIUI 的粉,手持小米 10 pro 512G 版本,发热真的是越来越严重,服了
mengqingshuise 122
mengqingshuise 14 小时 16 分钟前
@AKAMichael 我说怎么我的谷歌账号登不上,原来是升级系统的事。
Huelse 123
Huelse 13 小时 26 分钟前
@FawkesV #112
@az22c #117
的确重,毕竟 216g,个人觉得不用手机壳会舒服点

现在看 13pro 也有 203g,就还好
bigwhite 124
bigwhite 13 小时 22 分钟前 ❤️ 1
bilibili 有一个吐槽小米 11 的视频火爆了,我以为不会有人推荐小米 11 呢。。
superBearL 125
superBearL 1 小时 51 分钟前
为什么想不开呢,建议看看 B 站《小米圣经》
rexmann 126
rexmann 1 小时 45 分钟前
k30s 在手,除了重一点没太多问题,也没遇到多少 bug,但是*近有点发热,不知道是因为动态桌面还是 5G 的原因
zkhhkz123 127
zkhhkz123 1 小时 36 分钟前
@sxox P50 标准版是直屏的 其他配置也有大杯水准 可惜是 4G
user1121114685 128
user1121114685 2 分钟前 via Android
@archiyuan 无广告,全套谷歌框架,稳定些,安装软件什么的骚扰也少
user1121114685 129
user1121114685 1 分钟前 via Android
@Awes0me 因为 mtk 的 cpu 可以强解 bl 。

关于 Java 学习微服务或分布式学习路径的问题

目前学习完了 Springboot 一些框架,一些 redis,es 等框架。想进一步学习 Java 微服务或分布式等!看了部分的 Spring Cloud 的相关介绍,技术太多,而且有些已经过时,不知道学习那种比较好,所以希望大佬指导一下后面的学习路径!*好是列出相关的技术栈

学习 Java 分布式 路径9 条回复 • 2021-10-12 09:28:05 +08:00
ming168 1
ming168 14 小时 3 分钟前
+1
pengtdyd 2
pengtdyd 13 小时 56 分钟前
别卷了,不值得
546L5LiK6ZOt 3
546L5LiK6ZOt 13 小时 12 分钟前 ❤️ 3
这里够学的了: http://icyfenix.cn/
Wien 4
Wien 12 小时 47 分钟前
@546L5LiK6ZOt 周志明大佬,著作 Java 虚拟机必读书籍
xuanbg 5
xuanbg 12 小时 34 分钟前 ❤️ 1
具体的应用和工具使用方法有什么可学的。。。
1 、为什么需要微服务
2 、微服务是如何解决他需要解决的问题的
搞清楚这两个点就足够了。
RayDG 6
RayDG 10 小时 20 分钟前 via Android
可以看看黑马*新的微服务视频,会对微服务有个比较全面的认识
RayDG 7
RayDG 10 小时 19 分钟前 via Android
@RayDG 忘了说,是 B 站视频
yogogo 8
yogogo 3 小时 47 分钟前
框架看多了也没啥用,还是得上手才行。看看 Java 基础还有用一点
wangpugod2003 9
wangpugod2003 2 小时 2 分钟前
B 站油管找个 JAVA 语言的基于微服务的系统,跟着做就行了。
一般现在主流的有两个路线,一个是完全的 JAVA 栈,spring cloud 框架; 一个是 k8s,应用 java 写,docker 镜像部署到 K8s 集群。
看看自己想学哪个。

1password 太烂了,为何这么多人开车?

1,一共长期使用过三款密码管理器,分别是:lastpass,1password,bitwarden,其他的只试用了下。
2,但从编程的角度来说,lastpass,bitwarden 都很好,1password,是*差的,bug *多,尤其是 pc 客户端和网页端,这样的软件水平,我怀疑在国内也要丢饭碗。
3,从功能的角度来讲,lastpass 无疑是*激进的,1password 和 lastpass 都采用的入侵式对直接在输入框旁边进行提醒,1password 硕大的提醒栏经常对用户正常使用造成干扰,1password 甚至还让 mini 客户端跟送浏览器插件一起启动,这太让人恶心了,lastpass 的提醒比较小,基本不会造成干扰,bitwarden 只是在浏览器插件上显示数字提醒,刚开始不太适应,但用的久的反而喜欢这种简洁的提醒方式。
4,1password 在 pc 端使用的逻辑流程混乱,客户端,网页端,浏览器插件端,来回的跳,相比 BITwarden 的简洁高效简直天壤之别,BITwarden 仅仅使用浏览器插件能完成 90%的工作,只有涉及一些账户问题才会跳转网页端。
5,为什么 1password 开车的人*多,我现在明白这仅仅是这个公司营销做得好而已,先卖高价,然后采用送一年,打半折等各种方式促销,让用户觉得赚了便宜。但实际上针对用户体验来说,我个人认为 bitwarden 才是做的*好的。
password bitwarden lastpass 浏览器125 条回复 • 2021-10-12 10:51:00 +08:00
1 2
2
❮ ❯
iCUStOin 101
iCUStOin 12 小时 45 分钟前 via Android
我也更喜欢 bitwarden, 另外 lastpass 的移动端应用程序是一个套壳浏览器挺令人不愉快的。
rekulas 102
rekulas 12 小时 44 分钟前
在用 lastpass,因为担心有些风险自己本地额外加了层加密,安全性升级脱裤也不怕所以敢存储敏感信息
https://github.com/del-xiong/lastpass_dopass

https://camo.githubusercontent.com/e543c84f03b4829e1b2c15c8c259070fb39adef3de0d5ce348e0e75322d02f95/687474703a2f2f70686f746f7a6f6f6d2d7374617469632e73746f722e73696e616170702e636f6d2f322e6a7067

缺点是要麻烦些,也没有做手机端
zhjits 103
zhjits 12 小时 40 分钟前
为啥那么多人开车,那是因为友商衬托得好啊。

*早用的 LastPass,当时它连个存 TOTP 的功能都没有,有了 1Password 以后果断叛逃了。
BitWarden 也用过,那个交互逻辑,尤其是创建了 org 以后那些 org 里面的条目是否能搜到都不好说,莫名其妙的……

1Password 你不要用那个纯 JS 的浏览器插件,用跟原生应用通信的老版本就会好很多。当然 Windows 还是二等公民,那 .Net 客户端小细节问题很多,还是 macOS 客户端用着舒服……
haoliang 104
haoliang 12 小时 7 分钟前
翻了两页,只有一位提到了 [pass]( https://www.passwordstore.org),我想再增加一次曝光。

多年前我使用过两年的 lastpass,爆出安全事故后,遍找替代品,*后安顿在 pass 上:linux 上使用 pass,android 上使用 password store + openKeychain ;虽然不能自动填入,但胜在安全性。pass 的密码库使用 git 管理,具体文件内容使用 gpg 加密。
WebKit 105
WebKit 12 小时 4 分钟前 via Android
1p 没遇到过你说的问题,相反 bt 感觉非常难用,几次想转 bt,用了几次后还是放弃。你喜欢的 bt 在浏览器上提醒我感觉非常难用,比较喜欢 1p 的 mini 窗口方式。
skiy 106
skiy 11 小时 59 分钟前
已经弃 lastpass 了。免费的只能登录一个终端。(之前不是这样的,上个月发现 WEB 端和手机端 只能二选一,网页端还老是登录不上。索性弃用了。)

目前用 keepassxc + syncthing 同步。不好的地方是只能 PC 端,不支持手机和网页,数据库也是本地的。
xiparos 107
xiparos 11 小时 42 分钟前
1password 在 macOS 上用户体验还不错,回头试试你说的 bitwarden
bigwhite 108
bigwhite 11 小时 41 分钟前
对我来说只需要在电脑网页上登录,所以 lastpass 免费版够用,挺好用的, 没觉得有啥问题
smilingsun 109
smilingsun 11 小时 7 分钟前 via Android
刚发现 Firefox Nightly on Android 可以装 Bitwarden 的 addon,自动填充再也不用担心 Bitwarden 被杀后台了。
leverestfish 110
leverestfish 11 小时 6 分钟前
@dingwen07 居然还有这种功能,nb !
tomari 111
tomari 11 小时 3 分钟前 via iPhone
Bitwarden 用了半年,前几天发现公司免费领 3 年 1password,立马换了,真的舒服。能在输入框旁边就出现密码选择,和 chrome 自带密码的逻辑一样,这几天还支持了 ipad 和 iOS Safari extension,体验是很棒的。
edwinxe2v 112
edwinxe2v 10 小时 19 分钟前
Windows 的话,用 KeePass 本地存储,家配套的 Chrome 插件*好用。
dreamramon 113
dreamramon 5 小时 37 分钟前
bitwarden 存附件,截图什么的,即使自己部署,付费了都有容量限制,这个大家遇到过吗。。。
TossPig 114
TossPig 4 小时 24 分钟前
@dreamramon 肯定用 bitwarden_rs 呀,自己部署自用
vonsis 115
vonsis 3 小时 9 分钟前
@skfu 当年我从 Lastpass 转到 1Password,就是因为那时爆出 Lastpass 被脱裤,把我给气了个半死。改掉所有重要密码,并迁移到乘机打折的 1Password 上。
这每年 30 多刀,也是很肉疼的,但回过头你想想:这种软件的公司舒舒服服赚着这个钱,但凡敢出一点安全性上的问题,我就不可能再给他一个钢镚了。
f2ck 116
f2ck 2 小时 18 分钟前
信仰无敌,国外的月亮圆又圆,觉得密码放着国外安全。
ccppgo 117
ccppgo 2 小时 11 分钟前
@Andreas8 你说的这个东西没有 Windows 客户端吗
WebKit 118
WebKit 2 小时 1 分钟前
@f2ck #116 主要国内也没有能用的啊。。
darksora 119
darksora 1 小时 51 分钟前
现在换成 keepass 了,用坚果云同步一下。
之前用的 lastpass 。
Frauhling 120
Frauhling 1 小时 28 分钟前
我是 7 年 1password 老用户;办公时多浏览器混用,不加插件;日常跨平台存储靠 Dropbox 同步。Windows 下 Dropbox 挂到 OneDrive 上进行双重备份。
对我而言,1password 只用来生成密码及记录各项密码相关信息,足够日常使用。But 现在这么多人开车吗?楼主是不是要确认下自己因为信息茧房产生了焦虑?
jameswush 121
jameswush 56 分钟前 via iPhone
bitwarden 免费版够用,想安全的话在 nas 上自己搭也方便
ohwind 122
ohwind 47 分钟前
@f2ck 属实脑子沾点,你难道觉得国内有信得过的公司放密码?而且密码管理器就一定要放别人服务器?
ohwind 123
ohwind 46 分钟前
@f2ck 而且密码管理器许多都是开源的,懂开源啥意思不?
skfu 124
skfu 34 分钟前
@Frauhling #120 事实就是 pc 客户端和网页端使用体验*差,不能说用的久,习惯了,他就没问题了,农村的大娘大爷活了 60 年了,还天天念叨党的政策好,只有党才能救中国呢,真相可不是这么回事。
sicifus 125
sicifus 29 分钟前
我用 keepass+webdav 同步

MySQL 1000 万数据如何*快全量迁移?

自建的数据库(大概 1000 万条数据,2M 带宽),现在想迁移到阿里云的 RDS 上,如何用*少的时间迁移过去?

用了阿里云的数据迁移服务 DTS,非常的慢,而且一度把源服务器上的带宽占满,导致整个网站挂了。

问一问,大家有没有比较好的解决方法呢?

迁移 带宽 MySQL RDS23 条回复 • 2021-10-12 10:58:38 +08:00
taobibi 1
taobibi 19 小时 4 分钟前
虽然没解答,水 1 楼
https://v2ex.com/t/806269
我这边要迁移几千万个图片现在还在犯愁中
blackeeper 2
blackeeper 18 小时 59 分钟前
在阿里云的服务器上建一个从库,怎么迁移都没问题,又不影响你自建的主库
xiao109 3
xiao109 18 小时 55 分钟前
本地先切成小库,再分批迁移过去
blue7wings 4
blue7wings 18 小时 48 分钟前
@blackeeper 建立一个从库,历史数据还是要导入过去的吧,我现在想直接把这部分数据导入过去就可以了。
blackeeper 5
blackeeper 18 小时 41 分钟前
@blue7wings 你这个问题就是限速,避免影响现有的服务呗。你可以导出 SQL,然后压缩、用 rsync 限速传输到阿里云服务器就可以了
myd 6
myd 18 小时 3 分钟前
1. 导出 SQL 文件
2. 导入到新库
3. 配置主从(新库为从库)
4. 等到主从延迟为 0 的时候,停掉业务服务器
5. 应用这边切换数据库到新库
6. 启动业务
Xusually 7
Xusually 17 小时 38 分钟前
1 、做好方案,操作顺序捋清楚。
2 、临时升级带宽到满足迁移需要。
3 、迁移。
4 、带宽回退到 2M 。

花不了多少钱。
gengchun 8
gengchun 16 小时 19 分钟前
PB 一级的话,可以考虑阿里的离线迁移服务。比这小的话,其实可以试试看。*少也要几 TB 吧。

当然,没有到 TB,还是直接升带宽吧。
defunct9 9
defunct9 15 小时 35 分钟前 via iPhone
很简单啊,做主从。慢慢来就行了
netnr 10
netnr 15 小时 19 分钟前 via Android
开一台同区域的临时宽带按量计费的机子,再做端口转发
bing0 11
bing0 15 小时 16 分钟前
添加一块网卡 1G,好像可以找客服申请 5G 口,按量付费,迁移完后删除。
moult 12
moult 15 小时 9 分钟前
自建的数据库的服务商有没有云存储卖?有的话继续往下看。
导出 SQL 文件 – 打压缩包 – 通过内网传输到云存储上 – 开一台阿里云的按量付费实例 – 下载 SQL 压缩包 – 解压 – 通过内网导入 RDS
整个过程一小时肯定能搞定,因为云存储服务可以按流量计费,基本都不限速的。
Felldeadbird 13
Felldeadbird 13 小时 37 分钟前
内网迁移,服务器高度写 1000 万数据很快就完成了。 当然,不知道你 1000 万数据有什么内容。5G SQL 文件服务迁移大概 10 分钟完成。
bybyte 14
bybyte 10 小时 41 分钟前
物理迁移
helloworld000 15
helloworld000 10 小时 31 分钟前
直接邮寄硬盘
Junzhou 16
Junzhou 6 小时 36 分钟前 via iPhone
备份,然后 srync 或者临时带宽升级
jsrgqinbin 17
jsrgqinbin 2 小时 57 分钟前
阿里有免费的数据迁移的服务的,你找 DTS 这个产品看下
BeijingBaby 18
BeijingBaby 2 小时 50 分钟前
这么小的数据,根本不是问题啊。
qwerthhusn 19
qwerthhusn 2 小时 45 分钟前
2M 带宽,说明此站流量不大。
那为啥不把公网 IP 转成按量的,然后使用共享流量包呢?
可以用 200M 带宽,只收个流量包的费用
cxh116 20
cxh116 2 小时 29 分钟前 ❤️ 1
1. XtraBackup 备份导出.
2. 上传备份文件 OSS.
3. 在机器上面拉取 OSS 的文件(走内网,不限速的).
4. 使用 XtraBackup 恢复.
5. 查看 XtraBackup 的备份文件里的信息,设从库连到主库,等从库跟上主库.
6. 同步完成,从库转主库.
jixiangqd 21
jixiangqd 29 分钟前
@cxh116 阿里云 RDS 现在支持从 oss 导入 xtrabackup 的备份了
wuwukai007 22
wuwukai007 22 分钟前
直接把 mysql/data 压缩发过去
zhengxiaowai 23
zhengxiaowai 20 分钟前
#6 + #7 应该是*快的
导出 sql 上传到 oss,起一个机器从 oss 下载 然后导入 mysql

为什么都开始搞研发效能?

研发效能是目前互联网企业和传统软件企业都高度关注的领域,一线互联网企业希望通过“研发效能”实现持续的研发能力提升以应对日趋复杂的产品开发;腰部厂商则希望通过“研发效能”实现弯道超车,充分发挥后来者居上的优势;更多中小企业看到国内一线互联网企业不约而同地在这个领域重点投入,纷纷也是摩拳擦掌准备在效能领域发力。

一夜之间,似乎只有推进了研发效能,才能提升研发团队的效率,才能让自己在和友商的比拼中不至于输在起跑线上。

那么现在企业的研发效能实践到底为企业带来了多大的优势,又帮企业解决了哪些问题呢?那些推行研发效能的企业现在的状态怎么样?研效问题到底解决了吗?

别急,这些问题其实大多都还没有解决,而且有些问题可能还变得更糟糕了。毕竟研发效能的实施没有捷径,需要摸着石头过河,肯定不会能像电影里面演得那样注定会有皆大欢喜的结局。经历了风雨,不一定能看见彩虹,更有可能会得重感冒。所以想要快速解决研发效能的问题,我们首先需要对研发效能有一个全局的认识,需要先从正向的角度来理解研发效能。

到底什么是研发效能

和敏捷的概念类似,到底什么是研发效能很难精确定义。其实很多复杂概念也不是定义出来的,而是逐步演化出来的,是先有现象再找到合适的表述。其实,效率和效能也从来都不是软件工程的专有名词,纵观人类发展史,就是生产力和生产效率不断提升的发展篇章,到了数字化时代,软件研发效能的重要性被凸显了出来。如果要用一句话来总结研发效能的话,我们会用“更高效、更高质量、更可靠、可持续地交付更优的业务价值”来总结。

%title插图%num图1:研发效能的“*性原理”

解释一下其中几个关键概念:

  • 更高效:价值的流动过程必须高效顺畅,阻力越小越好。
  • 更高质量:如果质量不行,流动越快,死的也会越快。
  • 更可靠:安全性和合规性要保障好。
  • 可持续:输出不能时断时续,小步快跑才是正道,不要憋大招。
  • 更优的业务价值:这是从需求层面来说的,你的交付物是不是真正解决了用户的本质问题。

在这个概念的引导下,我们引出持续开发,持续集成,持续测试,持续交付和持续运维的理念,它们是研发效能落地的必要实践。与此同时,我们还需要从流动速度,长期质量,客户价值以及数据驱动四个维度来对研发效能进行有效的度量。

为什么一线企业都开始搞研发效能

近几年,各大行业龙头企业都纷纷开始在研发效能领域发力,我们认为背后的原因有以下这么三点:

%title插图%num图2:组织层面的“谷仓困局”

01 很多企业存在大量重复造轮子

就像“中台“概念一样,现在很多大企业的产品线非常广,其中存在大量重复的轮子,如果我们关注业务上的重复轮子,那么就是业务中台;如果我们关注数据建设上的重复轮子,那么就是数据中台;如果我们关注研发效能建设上的重复轮子,那就是研效平台,其实研效平台在某种程度上也可以称之为”研发效能中台“,其目标是实现企业级跨产品跨项目的研发能力复用,避免原来每条产品线都在做研发效能所必须的”0 到 1“,没人有精力去关注更有价值的”1 到 n“。现代化的研效平台会统一来打造组织级别通用研发能力的*佳实践平台。

02 toC 产品已经趋向饱和

从商业视角来看,现在 toC 产品已经趋向饱和,过去大量闲置时间等待被 APP 填满的红利时代已经一去不复返了,以前业务发展*快,那么用烧钱的方式(粗放式研发,人海战术)换取更快的市场占有率达到赢家通吃是*佳选择,那个时代关心的是软件产品输出,研发的效率都可以用钱填上。而现在 toC 已经逐渐走向红海,同时研发的规模也比以往任何时候都要大,是时候要勒紧裤腰带过日子了,当开源(开源节流中的开源)遇到瓶颈了,节流就应该发挥作用。这个节流就是研发效能的提升,同样的资源,同样的时间来获得更多的产出。

03 部分企业存在“谷仓困局”

从组织架构层面看,很多企业都存在“谷仓困局”(图 2),研发各个环节内部可能已经做了优化,但是跨环节的协作可能就会有大量的流转与沟通成本,从而影响全局效率。基于流程优化,打破各个环节看不见的墙,去除不必要的等待,提升价值流动速度正是研发效能在流程优化层面试图解决的一大类问题。

研发效能真的能够提高吗

既然如此重要,那接下来的问题是研发效能是否真的能提高?

很不幸,我们的观点比较悲观。我们认为研发效能的*对值随着以下因素的增长必然会变得越来越差,就像我(声明一下,这里没有张乐老师)的头发一样,随着时间的推移必然会越来越少一样。

  • 软件架构本身的复杂度提升(微服务,服务网格等)
  • 软件规模的不断增长(集群规模,数据规模等)
  • 研发团队人员规模不断扩大引发沟通协作难度增长

所以,我们能做的不是提升研发效能的*对值,而是尽可能减缓研发效能恶化的程度,使其下降的不至于太快,努力保持现状就是成功。

%title插图%num图3:研发效能的鸿沟

减缓研发效能恶化我们能干啥

看清了本质后,关于如何减缓研发效能的恶化,我们能做点什么呢?

可以说研发效能的涉猎面是很广的,软件研发的每个阶段都有研发效能需要关注的问题,腾讯提出的“研发效能双流模型”可以说很好的诠释了这一概念。双流模型从软件研发的各个阶段提出了研发效能提升的各种工程实践,并且倡导需求价值流和研发工程流的自动联动。

%title插图%num图4 研发效能的双流模型

这里我们列举一些实践给大家抛砖引玉一下,下期的文章我会更系统地来说明其中的*佳实践。

  • 可以通过 All-in-one 的开发环境降低每位开发人员开发环境准备的时间成本,同时又能保证开发环境的一致性。更高级的玩法是使用云端集成开发环境 IDE,实现只要有浏览器就能改代码,这一领域国内典型的代表就是腾讯云 CODING 旗下的 Cloud Studio 以及 Github 目前处于 beta 测试阶段的 CodeSpaces。
  • 可以借助基于 AI 的代码提示插件,大幅度提升 IDE 中代码的开发效率。输入一段相同的代码,不借助 AI 代码提示插件,需要敲击键盘 200 次,启用插件可能只需要 50 次键盘敲击,这样可以更容易让开发工程师进入“心流“状态,实现”人码合一“。
  • 代码的静态检查没有必要等到代码递交后由 CI 中的 Sonar 流程来发起,那个时候发现问题再修复为时已晚,完全可以通过 Sonar Lint 插件结合 IDE 实时发起本地的代码检查,有问题直接在 IDE 中提示,直接修复,这样开发工程师会更愿意修复问题,因为成本更低,也不会引起修复后的再次发版。
  • 单元测试比较耗费时间,可以借助 EvoSuite 之类的工具降低单元测试的开发工作量。
  • 对于规模较大的项目,每次修改后编译时间比较长。可以采用增量编译,甚至是分布式编译(Distcc 和 CCache)提升效率,对于 Maven 项目还可以通过缓存 pom 依赖树进一步降低编译时间。
  • 前端开发可以借助 JRebel 和 Nodemon 之类的工具使前端开发预览的体验更流畅,实现前端代码的“所见即所得”,避免重复的编译、打包、部署和重启步骤,以此提高开发过程的流畅度。
  • 选择适合项目的代码分支策略对提升效率也大有帮助。
  • 构建高度自动化的 CI 和 CD 流水线将大幅提升价值的流转速率。
  • 选择合适的发布策略也会对效能和风险之间的平衡起到积*的作用。比如架构相对简单,但是集群规模庞大,优选金丝雀,如果架构比较复杂,但是集群规模不是太大,可能蓝绿发布更占优势。
  • 引入 DevSecOps 与 DevPerfOps 实践,使安全和性能不再局限在测试领域,而是形成体系化的全局工程能力,让安全测试成为安全工程,性能测试成为性能工程。

研发效能的“罗生门”

好了,理解了研发效能的正面观点后,我们再回来看看研发效能在实际落地过程中又是一番什么样的景象。

可以说理想很丰满,但是现实很骨感,下面就我一起看看国内研发效能的各种乱象。

01 迷信单点局部能力,忽略全局优化和拉通的重要性

研发效能的单点能力其实都不缺,各个领域都有很多不错的垂直能力工具,但是把各个单点能力横向集成与拉通,能够从一站式全流程的维度设计和规划的研发效能成熟平台还是凤毛麟角。现在国内很多在研效领域有投入的公司很多其实还在建设,甚至是重复建设单点能力的研效工具,这个思路在初期可行,但是单点改进的效果会随着时间收益递减,企业往往缺少从更高视角对研发效能进行整体规划的能力。很多时候局部优化并不能带来全局优化,有时候还会是全局恶化。

02 具有普适性的通用研发效能工具其实没有专属工具来的好用

既然打造了研发工具,那就需要到业务部门进行推广,让这些研效工具能够被业务部门使用起来。其实,很多比较大的业务团队在 CI/CD、测试与运维领域都有自己的人力投入,也开发和维护了不少能够切实满足当下业务的研发工具体系。此时要把新打造的研效工具来替换业务部门原来的工具,肯定会遇到很强的阻力。除非新的工具能够比老工具好 10 倍,用户才可能有意愿替换,但实际情况是新打造的工具为了考虑普适性很有可能还没有原来的工具好,再加上工具替换的学习成本,所以除非是管理层强压,否则推广成功的概率微乎其微。即使是管理层强压,实际的执行也会大打折扣,接入但不实际使用的情况不在少数。

03 用“伪”工程实践和“面子工程”来滥竽充数

如果你去比较国内外研发效能工程实践的差距,你会发现国内公司和硅谷公司的差距还是相当明显的。但是当你逐项(比如单元测试,静态代码扫描,编译加速等)比较双方开展的具体工程实践时,你会惊讶地发现从实践条目的数量来说,国内公司的一点都不亚于硅谷公司,在某些领域甚至有过之而不及。那为什么这个差距还会如此明显呢?我们认为这其中*关键的点在于,国内的很多工程实践是为了做而做,而不是从本质上认可这一工程实践的实际价值。这里比较典型的例子就是代码评审和单元测试。虽然很多国内一线互联网企业都在推进代码评审和单元测试的落地,但是在实际过程中往往都走偏了。代码评审变成了一个流程,而实际的评审质量和效果无人问津,评审人的评审也不算工作量,也不担任何责任,这样的代码评审能有什么效果,结果可想而知。单元测试也沦为一种口号,都说要贯彻单测,但是在计划排期的时候压根没有给单测留任何的时间和人力资源,可想而知这样的单测是否能成功开展。所以,国内公司缺的不是工程实践的多少,而是工程实践执行的深度。不要用“伪”工程实践和“面子工程”来滥竽充数。

04 忽略研发效能工具体系的长尾效应

再回到研效工具建设的话题上,很多时候管理团队希望能够打造一套一站式普遍适用的研发效能平台,希望公司内大部分业务都能顺利接入,这和想法的确非常好,但是不可否认的,研效平台和工具往往具有非标准的长尾效应,我们很难打造一套统一的研效解决方案来应对所有的业务研发需求,各种业务研发流程的特殊性是不容忽视的。退一万步说,即使我们通过高度可配置化的流程引擎实现了统一研效解决方案,那么这样的系统会因为过于灵活,使用路径过多而易用性变得很差。这两者的矛盾是很难调和的。

05 盲目跟风

再来看看一些中小型研发团队,他们看到国内一线互联网企业在研效领域不约而同的重兵投入,所以也会跟风。他们往往试图通过引进先进企业的工具和人才来作为研效的突破口,但实际的效果可能差强人意。一线互联网企业的研效工具体系固然有其先进性,但是是否能够适配你的研发规模和流程是有待商榷的。很多时候研效工具应该被视为起点,而不是终点,就像你买了一辆跑车,你依旧不能成为赛车手。

06 迷信外部专家

引入一线互联网专家其实也是类似的逻辑,我常常会被问及这样的问题:“你之前主导的研效提升项目都获得了成功,如果请你过来,多久能搞定”?这其实是一个无解的问题。一定程度上,投入大,周期就会短,但是,实施周期不会因为投入无限大而无限变短。我可以帮你避开很多曾经踩过的坑,尽量少走弯路,犯过的错误不再次犯,但是,适合自己的路子还是要靠自己走出来,拔苗助长只会损害长期利益。

07 研效度量的罪与罚

*后再来看看度量。研发效能的度量一直以来都是很敏感的话题。科学管理时代我们奉行“没有度量就没有改进”,但是数字时代这一命题是否依然成立需要我们的反思。现实事物复杂而多面,度量正是为描述和对比这些具象事实而采取的抽象和量化措施,从某种意义上来说,度量的结果一定是片面的,反映部分事实。但没有银弹,也没有完美的效能度量。数据本身不会骗人,但数据的呈现和解读却有很大的空间值得探索。那些不懂数据的人是糟糕的,而**糟糕的人是那些只看数字的人。当把度量变成一个指标游戏的时候,永远不要低估人们在追求指标方面“创造性”,总之我们不应该纯粹面向指标去开展工作,而应该看到指标背后更大的目标,或者是制定这些指标背后的真正动机。

总体来看,对于研发效能,我认为*重要的不是技术升级,而应该是思维升级,我们身处数字化的变革之中,需要转换的是自己的思维方式,我们需要将科学管理时代的思维彻底转为数据经济时代的思维。

研发效能的“冷思考”

*后,回到工程师层面,研发效能的提升对我们而言又意味着什么?

01 工具效率的提升并没有减少我们的工作时长

新工具新平台在帮助我们提升效率的同时,也不断增加着我们学习的成本。用前端开发来举例子,以全家桶为基础的前端工程化大幅度提高了前端开发的效率,但与此同时前端开发工程师的学习成本却在成倍增加,“又更新了,实在学不动了”一定程度反映了前端同开发的悲哀和无奈。

02 技术的升级正在不断模糊工作和生活的边界

早年时候的工作沟通除了面聊以外主要靠邮件,非工作时段老板给你发邮件你有各种正当理由不用及时回复,可是现在及时通讯工具 IM(那个消息已读提示,你懂的)再结合各种 ChatOps 实践,已经让工程师已经无法区分什么是工作什么是生活了,这难道是我们想要的吗?

随着在研发效能领域的不断投入,会有越来越多的研效工具诞生,所有这些工具都使人与工作之间的链接更加紧密,人越来越像工具,而工具越来越像人。我们之所以创造工具是想减轻我们自己的工作,但现实却很可能发展成,我们*终沦为被亲手创造的工具奴役。我们致力于的研发效能,究竟会成就我们,还是毁了我们?值得我们深入思考。

对于研发效能,实施的思路不对,方法不对会搞垮一个团队,我们需要的是体系化的方法论和相应的工程实践。

给Arm生态添把火,腾讯Kona JDK Arm架构优化实践

前言

Arm架构以其兼具性能与功耗的特点,在智能终端以及嵌入式领域得到了广泛的使用,不断扩大其影响力。而在PC端以及数据中心,之前往往是x86架构在其中发挥着主要的作用。*近,随着人工智能、云计算等技术的兴起,5G网络的不断成熟,万物互联的时代是的应用的需求越来越多样化,使得对于芯片架构的需求也越来越多样化。

Arm架构在提供可靠性能的基础上,低功耗、低开销的特点使得它被越来越广泛的应用到数据中心和云计算中,成为其中必不可缺少的重要组成部分。亚马逊投入大量精力自研Arm服务器,并应用到AWS服务中,*多实现了成本45%的降低;阿里巴巴也在云服务中大量采用Arm服务器,并积*参与Linaro,Adoptium等组织,不断推动Arm架构的发展。

*近几年,腾讯对于Arm架构的需求也不断增加,各个产品线也不断引入Arm服务器,对于Arm架构软件的需求也在不断增长。KonaJDK团队在腾讯公司内部提供高性能、高稳定性的商用JDK版本,坚定地将Arm架构作为KonaJDK重点支持的架构之一,不断扩展JDK在Arm架构的功能,并不断提高Arm架构中JDK的性能。

%title插图%num

随着Arm架构在终端和云计算场景的广泛应用,JDK需要做好对于Arm架构的支持工作,才能更好地得到发展。目前在JDK社区,Arm架构属于*梯队支持架构。而对于Arm架构而言,Java语言“一次编译,到处运行” 的特性适合业务应用无缝推广到Arm平台,而JDK则是Java应用运行的必要条件。JDK对于Arm架构的支持,也是Arm生态推广的有力支撑。在这个过程中,KonaJDK团队希望和Arm紧密合作,共同发展。

腾讯和Arm在JDK方面的合作交流

KonaJDK

目前腾讯和Arm在JDK方面已经有了深入的交流和合作。双方针对JDK在Arm架构常见的性能问题,对于Arm架构新特性的支持情况等方面进行了广泛和深入的讨论,通过性能测试、数据交流、技术研讨等形式不断推动JDK在Arm架构的发展。

KonaJDK团队Arm平台优化技术介绍

KonaJDK

目前在Arm架构,KonaJDK平台已经发布了JDK8和JDK11两个版本,在2021晚些时候还会发布*新的JDK17版本。Kona JDK团队从功能、性能多方面出发,在Arm架构支撑KonaJDK的通用特性,并针对架构特征进行优化,保证Java应用向Arm平台迁移的一致性,为Arm架构推广做好准备。

ZGC:

GC使得程序不再需要手动控制内存的释放,有效的降低了内存管理相关错误产生的可能性。但是,对于GC算法而言,如何准确高效的进行内存清理是一个复杂的过程。随着业务需求的不断发展,GC算法也在不停地迭代,只有针对不同的业务目标,选择*合适的GC算法,才能够更好的帮助业务实现其目标。近几年,随着服务器硬件性能越来越强劲,其软件应用往往也需要更大的堆,从10G到100G,甚至TB级别。在这种环境下,传统的CMS、G1等GC算法,其停顿时间往往随着堆大小的增长而增加,对于超大堆在触发Full GC的时候,甚至可能产生分钟级别的停顿,这样对于延迟敏感的应用来说,GC 停顿已经成为阻碍 其广泛应用的一大顽疾,需要更适合的 GC 算法以满足这些业务的需求。

ZGC 是由JEP333引入JDK,希望彻底解决GC停顿带来的延迟问题,其设计目标为:每次GC停顿时间控制在10ms以下;相对于G1 GC,吞吐率下降不超过15%;支持大堆和特大堆,并且停顿时间不随着堆大小的增长而增长。ZGC从 JDK11 开始推出实验性版本,并随着JDK新版本发布不断补充完善,*终在JDK15中成为正式版本,保证了 Java 停顿时间不会随着堆大小和业务规模的增加而增长。为对GC停顿要求高的业务提供了一种更好的选择。

%title插图%num

图 1 ZGC性能(出自The Design of ZGC,Per Lidén)

KonaJDK团队为了满足业务的需求,在Tencent Kona JDK11版本中,完善了ZGC功能的补全,并进行了长期的验证落地,使得对GC停顿敏感的业务也能够在JDK11版本中满足对于低GC延迟的需求。JDK11在2018 年下半年发布,属于Long-Term Support版本,而后续LTS版本为JDK17,预计将于2021年9月发布,中间其他版本属于过渡开发版本,没有持续的更新和修复。因此,KonaJDK团队选择在JDK11完善ZGC的功能,满足业务的需要,即使后续JDK17发布之后,业务版本更新也需要一个过程,在这期间,仍然需要JDK11的支持。

对于Arm架构而言,在JDK11支持ZGC相对于x86架构是一个更大的挑战。x86架构从JDK11开始ZGC就作为Experimental特性开始发布,但是在Arm架构,从JDK13才有对于ZGC的支持。KonaJDK团队进行了大量的工作完成了Arm架构在JDK11中对于ZGC的支持:

  • 需要选择JDK在Arm架构中合适的提交移植到JDK11版本
  • 从JDK11到JDK13,ZGC代码以及Hotspot代码经过了多次重构,在代码移植过程中需要分析代码重构的功能以及影响,或者移植相关重构代码,或者根据JDK11对相关代码进行适配修改
  • 根据Arm架构的特征,适配团队对于ZGC的优化、功能增强以及Bug修复。
  • Arm属于RISC架构,而且使用弱有序内存模型,因此在适配相关汇编代码(特别是ZGC使用的barrier)时,需要仔细斟酌指令的选择,在保证正确性的基础上尽可能的降低开销,提高效率
  • 在Arm平台进行充分、全面的测试,保证相关代码的健壮性

KonaJDK团队在Arm结构支持ZGC的过程中,遇到的*大困难在于如何正确添加barrier指令保证正确性。由于Arm使用弱有序内存模型,在x86平台能够正确执行的代码在Arm架构下可能由于缺少必要的barrier导致产生随机错误。KonaJDK团队在初步完成ZGC支持代码之后,进行ZGC压力测试过程中,发现存在执行若干次GC之后,存在JDK随机崩溃的现象,发生几率几千分之一。通过对错误现场的分析,大概率怀疑是缺少必要的barrier所致。尝试通过对社区代码以及ZGC逻辑对问题进行分析,在这个过程中,JDK13和JDK11代码结构的不同进一步加大了分析的难度,*终KonaJDK团队完成该问题的修复,ZGC代码在Arm架构连续运行数百万次无问题。

和其他GC算法一样,ZGC也有其适用的业务场景。ZGC算法*大的优势是能够将停顿时间控制在10ms以下,特别适合对于停顿时间敏感的业务。但是为了实现如此短的停顿时间,ZGC的代价是一部分性能损失和内存消耗。ZGC通过将若干任务进行并发化改造,使得若干之前必须在停顿时完成的工作,可以和应用代码并发执行,有效的降低了必须的停顿时间。但是这种并发执行,以及其引入的各类Barrier,也会导致一定程度的应用吞吐率下降。通过整个 OpenJDK 社区的持续投入,当前 ZGC 在性能损失场景中的性能下降已经控制在很小的范围内。对于性能来说,如充足的内存下即大堆场景,ZGC 在各类 Benchmark 中能够超过 G1 大约 5% 到 20%,而在小堆情况下,则要低于 G1 大约 10%。

因此,不同的业务需要根据实际的情况,选择更为合适的GC算法,来保证吞吐率和停顿时间都能够满足业务的需求。目前来看,如果业务应用使用了超大堆(几十G甚至上百G)为了避免传统G1等GC算法Full GC时带来的几十秒甚至分钟级别的停顿,建议使用ZGC。另外如果业务对于停顿时间的有着严格的时限要求,那么也建议使用ZGC。

KonaFiber

应用在需要并发执行多项任务的时候,会创建多个线程,每个线程负责一项任务,从而实现任务的并发执行。但是,随着业务规模的不断增大,如果仍然为每一个任务创建一个线程,由于线程本身内存消耗较大,会导致占用大量的内存。另外,线程切换需要内核完成,大量的线程存在时,其频繁的切换开销也会影响并发执行的效率。协程就是为了解决这种情况而诞生的。协程是一种轻量级的线程,兼顾开发效率和执行效率。协程的切换在用户态完成,比线程切换开销小很多,同时对于内存的需求更低,相对的需要应用代码编写时关注部分协程切换的工作。协程相对于线程,在高并发场景能够取得更好的性能,应用越来越广泛。OpenJDK也启动了Java协程原生支持项目:Project Loom,开发时间超过3.5年,并在不断发展完善,即将成为Experimental特性。

KonaFiber是KonaJDK团队实现的协程方案,它在兼容OpenJDK社区Loom API的同时,提供了更好的切换性能,不过需要部分额外的内存开销。KonaFiber根据业务的需要,目前在JDK8和JDK11实现,和社区兼容的API使它成为可以和社区方案一起长期演进的协程方案。目前KonaFiber已经完成对于Arm架构的支持,能够满足Arm架构应用对于协程的需求。

%title插图%num

图 2 KonaJDK和Loom对比

为了满足业务的需求,提供更好的协程切换性能,KonaFiber采用了基于JKU的StackFul有栈方案,为每一个协程创建独立的堆栈。当进行协程切换的时候,JDK在对于协程Pin状态检测以及上下文保存之外,只需要修改Frame Pointer和Stack Pointer的值就可以完成协程的切换工作,逻辑简单且性能开销很小。不过相对于社区的方案,KonaFiber的StackFul方案对于内存的使用要多一些,更适用于对于内存消耗不太敏感,但是对于性能更敏感的业务场景。性能数据如图 2所示,左图表示在不同协程数量情况下,每秒内协程切换次数对比;右图对内存消耗进行了对比。

%title插图%num

图 3 KonaFiber性能对比

KonaFiber的实现注重优化以及代码重构,通过多种方式不断进行优化:

  • 协程轻量化,不断优化降低协程的资源消耗
  • 按需创建,根据业务的需要创建协程,降低内存使用
  • GC优化,优化实现,降低协程对GC引入的开销
  • 稳定性修复,通过广泛的测试以及业务适配,提高健壮性

相对于OpenJDK社区的协程方案Loom,KonaFiber提供了更高更稳定的调度性能。图 3对比了KonaFiber和Loom在不同协程数量情况下的每秒调度次数。

%title插图%num

图 4 调度性能对比

目前KonaFiber在KonaJDK8中已经开源,后续也会在KonaJDK11中开源,KonaJDK也会持续跟进Loom社区并不断完善KonaFiber的实现。

OWST优化

GC运行过程中,存在若干GC线程并行处理各种任务,但是不同任务的处理时间不等,使得各个GC线程之间负载分配并不平衡。JDK中通过如下的方式来平衡各个GC线程之间的负载,降低GC的停顿时间:当一个GC线程执行完成它被分配的任务之后,会查看其它GC线程的任务队列,如果存在这个线程可以执行的任务,那么它会将该任务“偷取”过来并执行。该过程持续循环直到GC结束。该方案实现了负载的自动平衡,但是执行过程中,由于可能多个GC线程同时“偷取”任务,在线程数量较多时,锁的竞争会比较激烈,同时抢锁过程中,各个GC线程的自旋等待也会导致一定的性能开销,使得该算法实际表现差强人意。

为了优化这个过程,Google在ISMM 2016发表了的论文提出了一种新的负载均衡算法:Optimized Work-Stealing Threads(OWST)。该算法的基本思想是:当存在多个GC线程需要“偷取”任务时,*终只有一个线程执行“偷取”操作,其它线程进入等待状态。执行“偷取”操作的线程检查各个GC线程的任务队列,根据任务个数唤醒线程,并执行任务。算法有效的降低了各个GC线程之间对于锁的竞争,提高了整个负载均衡的效率。

OpenJDK社区首先在Shenandoah GC上实现了OWST算法,在JDK12版本中合入主干分支并成为默认的Parallel Terminator。为了更好地支持LTS版本,KonaJDK团队将OWST算法相关代码移植到JDK8和JDK11,并完成相关代码适配和测试工作,经过业务端验证,为JDK8和JDK11添加了商用的OWST算法支持,有效降低了GC并行任务的执行时间,降低了GC的停顿时间。

通过对SPECjbb2015的性能进行测试,使用ParallelGC时OWST在对于max-jOPS基本没有影响的前提下,能够提升大约8%的critical-jOPS评分。另外对于腾讯内部大数据相关的Map/Reduce以及Spark SQL任务进行测试,执行性能也有10+%的提升。

业务应用

KonaJDK

目前在Arm架构,ZGC已经在腾讯的大规模生产中得到了实践应用。

ZGC将停顿时间控制在10ms以下的特性,使得它特别适合停顿时间敏感的业务。腾讯的WAF团队使用Java语言来快速实现产品功能迭代及上线。该团队有一个旁路安全服务,是一个基于Netty框架的Http服务。它对于端到端请求的时延要求特别严格,需要达到99.99% 请求时延小于 80ms 的 SLA 目标。传统的GC算法,难以达到如此高的标准,较长的停顿时间对于该服务有一定的负面影响,需要寻找一种更低停顿时间的GC算法。WAF团队之前采用了G1 GC算法,花费了大量的时间和精力对G1 GC进行选项调优以及代码层面的修改,但由于G1GC本身的不足,仍然存在请求抖动延迟,无法达到既定的 SLA 目标。后续在KonaJDK团队的配合下,通过切换ZGC算法,实现了该业务的P9999 请求延迟稳定小于 80ms,为用户提供了更快速、稳定的服务。

后续计划

KonaJDK

目前KonaJDK团队在Arm架构,主要在JDK8和JDK11版本进行优化和支撑,后续也会支撑JDK17等版本。KonaJDK团队会持续对JDK基础类库、运行时、内存管理、执行引擎等等各个模块进行分析和测试,不断扩展JDK的功能,提升性能。

KonaJDK团队会始终将Arm架构作为重点支撑平台,不断加大投入,推动并完善JDK对于Arm架构的支持,满足对于Arm架构不断增长的需求。