[Dr.Lib] Data Mining: KNN and Decision Tree

Recently I want to write a technical post in English.
It would have been Fully modular ASP.Net assembly but I'd wait until .Net 2.1's release because it fixed a critical issue related to my project.
So I decided to write down my Data Mining course's laboratory report, as a reminder and a note.

Environment

I use Anaconda3 as my python3 env. Here is my conda's environment.yml for each experiment.
environment.segment.yml
environment.mushroom.yml

Goal

Train Decision Trees and KNN in scikit-learn against two dataset "mushroom" and "segment". Analyze theirs performance and characteristic based on the result.
继续阅读

[Dr.Lib]Minecraft 服务器资源控制策略:AI 抑制而非数量限制

转载自卷的 Minecraft 服务器资源控制策略:AI 抑制而非数量限制 · Phoenix's island

Minecraft 的 lag 问题已经司空见惯,各种控制资源消耗和卡顿的插件也层出不穷。但是它们几乎都非常用力地在一个点上:控制实体数量。

这并不无道理,因为 Minecraft 中最消耗资源的部分就是实体。但是暴力控制实体数量会导致刷怪塔无法正常工作、掉落物清理速度过快等问题,在生存服务器中可能引发玩家的强烈不满。

所以,喵窝开发组从另一个角度做出了一些尝试。

启发

生物实体的数量巨大,主要集中的地区显然不是野外的自然刷怪区,而是玩家聚集的刷怪场、村民工程、动物养殖场等。如果不限制生物的数量和密度同时降低资源消耗,那么只能从生物实体的特性入手了。

Minecraft 最近的版本中引用了 NoAI 的 NBT Tag,带有此标签的生物将不会进行 AI 计算。换句话说,除了占用服务器内存中的一点数据,几乎不会对这个生物实体有任何其他的 CPU 算力消耗。

也就是说,实体消耗的算力资源,绝大部分都是 AI 计算的消耗。

方案

抓上一票人做了一些测试,结果证实生物失去 AI 后大幅降低了 CPU 的算力消耗。这是个 positive 的信号,但是接下来的测试则遇到了问题。

对于养殖场,等生物数量变化不大(或者说只是定期来清理并重新养殖一次)的设施,生物失去 AI 的影响很小,只有在重新繁殖时需要恢复 AI。但是刷怪塔则因为生物没有 AI,同时也被强制不受重力影响而几乎无法使用,即便同时设置 NoGravity 为 false 也无效。

开发组中 @Librazy 提到了 Spigot 的一个参数 nerf-spawner-mobs ,开启时刷怪笼生成的生物将不会拥有 AI,但是会被外界影响(例如水流和火球等)而移动。这个选项是全局的,因此不需要开启,只需要反射 spigot 中设置该功能的方法即可。

经过 @Cylin 查阅Spigot的代码,这个参数会给刷怪笼生成的实体设置 fromMobSpawner = true ,导致实体的 doTick()中跳过实体的AI处理。

于是整个方案的流程便是当服务器卡顿时抑制生物密集区的生物 AI 从而降低资源占用,同时最大程度上保证玩家对生物的需求。「服务器卡顿」的考量以服务器 TPS 而非实体数量为准,当服务器 TPS 高于一定值时即认为服务器没有超负荷,不会有任何操作,最大程度上利用硬件的性能。

实现

插件主要由开发组的 @Cylin 编写,源代码以 MIT 协议发布在 GitHub 上。

插件每隔一段时间扫描服务器的 TPS 确认运行状况,如果 TPS 低于阈值则触发 AI 控制,TPS 高于一定值且持续一段时间即认为服务器已恢复正常运行状态,自动恢复被抑制的实体 AI 减少对生存体验的影响。

实现过程中额外添加了一些额外可能被生存服务器用到的功能:

  • per-world 控制,如果玩家需要建造以仇恨为基础的小黑塔,可以关闭对末地的控制。
  • 实体总量和单区块实体密度在 AI 抑制时纳入考虑,更加精准抑制资源消耗较高的区块。

测试

yasui 插件在 毛玉線圈物語 服务器中应用测试。由于近期玩家数量爆炸式增长(日常在线 5 人到 ~30 人甚至 50 人),各种实体控制插件均告无效。yasui 插件应用后被证实数次发挥作用,没有任何实体数量限制的前提下将服务器 TPS 稳定在 19 以上,服务器实体承载数量从 ~2500 提到至接近 5000,并且还有继续提高的可能(数次触发中最高一次单世界实体记录是 4808,其他世界中仍有大约 2000 实体未被计入)。

吐槽:你们贼能刷

[Dr.Lib]跑起一个TiDB

TiDB 是新一代开源分布式 NewSQL 数据库,模型受 Google Spanner / F1 论文的启发, 实现了自动的水平伸缩,强一致性的分布式事务,基于 Raft 算法的多副本复制等重要 NewSQL 特性。 TiDB 结合了 RDBMS 和 NoSQL 的优点,部署简单,在线弹性扩容和异步表结构变更不影响业务, 真正的异地多活及自动故障恢复保障数据安全,同时兼容 MySQL 协议,使迁移使用成本降到极低。

PingCAP

TiDB 是 PingCAP 公司基于 Google Spanner / F1 论文实现的开源分布式 NewSQL 数据库,具备如下 NewSQL 核心特性:

  • SQL支持 (TiDB 是 MySQL 兼容的)
  • 水平线性弹性扩展
  • 分布式事务
  • 跨数据中心数据强一致性保证
  • 故障自恢复的高可用

一个完整的 TiDB 集群包括 PD,TiKV 以及 TiDB。

获取TiDB 官方 Binary

在 Archlinux 下可以使用AUR中的tidb-bin-nightly包。对于大多数发行版,官方的二进制都能完美的工作。

可以使用-V命令查询当前二进制的版本、编译时间。

部署TiDB

我的测试环境有三台机器,为方便起见做了如下配置

单节点部署

官方文档参考

启动TiDB需要按顺序启动 PD -> TiKV -> TiDB

在服务器上部署的时候,可以在nohup或者tmux中启动。笔者推荐使用基于tmux的byobu以方便管理与监控。

在以受限用户运行tikv的时候,可能会遇到这样的错误

此时可以选择以root用户启动或在配置文件中按实际情况指定RocksDB的max-open-files。

全部启动完成后,就可以使用mysql客户端连接了。TiDB默认的MySQL监听端口是0.0.0.0:4000

添加与卸载节点

官方文档参考

添加pd节点

在两台机器上分别启动pd节点并加入集群

添加tikv节点

可以使用pd-ctl查看当前集群状况

删除节点

可以用pd-ctl进行,或使用PD API

多节点集群模式部署

官方文档参考
在三个机器上分别启动pd实例

pd启动完成后,启动tikv实例

启动tidb

开始使用TiDB

你可以从 MySQL 无缝切换到 TiDB。如果您现有的业务已经基于 MySQL 开发,那么大多数情况下无需修改代码即可直接替换单机的 MySQL

 

更多信息可以参考官方文档

[Dr.Lib]各种.travis.yml

于是这两天撸mod和插件的.travis.yml的时候还是整出了不少东西的,记录一下什么的。

C++: 测试Clang3.8 & GCC 6 的 Coveralls 数据

这个是当年折腾数据结构时写的CI了,因为travis的Ubuntu环境目前还是古代的12.04 precise,所以很多东西要么走PPA要么直接下

这里我用的是两个镜像,分别测Clang与GCC。由于两个编译器的目标gconv版本不同所以还需要判断一下.

Java Minecraft Forge mod:repo无关的.travis.yml & 自动更新update.json

其实主要部分还是给了gradle来做= =

要做到.travis.yml和gradle里不带repo信息的话,善于利用环境变量吧。

有一个遗憾是 travis-ci/dpl issues#613 ,暂时没法自动设定是否为prerelease^

 

Java Spigot plugin:repo无关的.travis.yml & 自动更新maven repo

 gz

[Dr.Lib@ASTL]开始使用Open-Channel SSD

Open-Channel SSD文档翻译:

https://github.com/OpenChannelSSD/documentation/blob/master/docs/gettingstarted.md

 

要使用Open-Channel SSD,操作系统内核的支持是必要的。通过LightNVM 子系统的引入,Linux内核在4.4及以后的版本添加了Open-Channel SSD支持。OpenChannelSSD 这个项目仍在开发中,推荐使用最新的 release 版本或者RC版。最新的源码可以参见https://github.com/OpenChannelSSD/linux

启动一个受支持的内核后,需要满足下列条件:

  1. 一个兼容的设备,如QEMU NVMe或者一个Open-Channel SSD,如 CNEX Labs LightNVM SDK.
  2. 驱动之上的媒体管理器。媒体管理器负责管理设备的分区表。
  3. 块设备管理器之上暴露Open-Channel SSD。

继续阅读