MAC 上的 docker desktop 里面使用 eBPF
有时候, 我们想在 container 里面使用 eBPF, 可是 Mac 上面的是一个虚拟机:
有人专门给这个做了一个 image, 对于 Mac 上用户在 docker 里面使用 eBPF 特别友好.
https://github.com/singe/ebpf-docker-for-mac
有时候, 我们想在 container 里面使用 eBPF, 可是 Mac 上面的是一个虚拟机:
有人专门给这个做了一个 image, 对于 Mac 上用户在 docker 里面使用 eBPF 特别友好.
https://github.com/singe/ebpf-docker-for-mac
虽然今天 CMS GC 已经不被推荐, 可是还经常被用来和G1 GC 做对比. 其中导致CMS 不被推荐的重要原因是: CMS 的full GC 是单线程的, 在如今多核统治天下的情况下, 单线程的 full GC 肯定比多线程的 full GC 慢很多.
二者的数据结构不一样, 如果引入需要大量修改
据说开发工程师把更多的时间都用去写 G1 了, 并且 G1 各方面的期望都比CMS 好, 没有必要再写要给给CMS.
google 内部有一个CMS 的老年代GC 实现, 并且曾经尝试patch到openJDK, 不过最后没有做到:
http://openjdk.java.net/jeps/8130200
最好还是用G1
本文记录了一次奇怪的线上线程相关问题的案例.




正常的推理已经不能解决问题, 于是开始归纳总结. 发现如下模式:

可是从上面的这些模式, 并么有推断出什么.







类似这样的线程有:

在生产环境看到这个问题之后, 去测试环境看了一下, 有如下总结:
改动 WrapperJarApp 的源码, 在生产新线程的地方加了日志, 改了线程的名字, 发现日志中该方法只有一次被调用
long i = System.currentTimeMillis() % 10;
Thread mainThread = new Thread(this, i + "-WrapperJarAM");
Thread.dumpStack();如今的问题:
终于看到这些线程在干嘛

找到调用 JNI 共享库的代码 - 从项目源代码中找到了相应的代码, 如下:
private static final String PATH = "/home/supra/work/test/blas/netlib-blas-dist/src/main/resources/linux-x86_64";
private static final String[] NETLIB_LIBS = {
"libquadmath.so.0", "libgfortran.so.3", "libopenblas.so.0", "libblas.so.3", "liblapack.so.3" };
public static void main(String[] args) throws IOException {
for (String lib : NETLIB_LIBS) {
System.load(new File(PATH + "/" + lib).getAbsolutePath());
NativeLibrary.getInstance(lib);
}
NativeSystemBLAS blas = new NativeSystemBLAS();
double prod = blas.ddot(4, new double[] { 1.0, 1.0, 1.0, 1.0 }, 1, new double[] { 1.0, 0.0, 1.0, 0.0 }, 1);
if (prod != 2.0) {
throw new IllegalArgumentException("BLAS sanity test failed. Expected 2.0. Got: " + prod);
}
System.out.println("done");
try {
Thread.currentThread().sleep(1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}为什么会创建 (cpu count - 1) 个线程?

到此为止, 我们终于搞明白了这些线程哪来的?这些线程数目和 CPU 个数的关系. 其它一些相关的话题:
上周整理某个grafana文件夹下的 dashboard 的时候, 看到一个 dashboard 的名字叫 XXX-copy, 觉得这个太无趣, 可能是一个临时 copy 的 dashboard, 立马起了杀意, 直接删除. 这周到公司, 直接有人说我删除了他辛辛苦苦已经加工了半个月的 dashboard. 我无语. 想该怎么恢复.
google 了一下, UI 上无法恢复已经删除的 dashboard. 我们的 Grafana 没有用默认的 sqlite3, 而是使用 msyql, 并且是 DBA 专业30年维护. 于是找到 DBA 要了一个删除之前的那天的数据库 snapshot. 这个 snapshot 是一个 sql 文件. 压缩后300多M, 解压后2.5G.
于是拿到这个数据库 snapshot, 先解压, 然后通过 docker 安装一个 msyql, 导入数据, 然后再安装一个 grafana, 然后导出dashboard 数据, 再导入正在使用的grafana, 问题解决. 下面是具体步骤(前提本地有安装好的 docker)
安装 mysql
$ docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql复制 数据文件到 mysql container (ec2c00bc4837 是 上面 mysql 的 container id [docker ps])
$ docker cp ~/Downloads/grafana.sql ec2c00bc4837:/进入 mysql container 导入数据
$ docker exec -it ec2c00bc4837 /bin/bash
# /usr/bin/mysql -u root -p > /grafana.sql本地定制 grafana 的配置文件 custom.ini, 只要修改 defaults.ini 的 database 部分, 具体参考这里: https://grafana.com/docs/grafana/latest/administration/configuration/
[database]
type = mysql
host = mysql
name = mygrafanaDB
user = root
password = 123456docker 安装 grafana 使用定制配置文件
$ docker run --link mysql -d --name grafana -p 3000:3000 -v ~/Downloads/custom.ini:/etc/grafana/grafana.ini grafana/grafana现在就可以等你的 grafana 了 http://localhost:3000/
另外如果你发现你需要某些特定的用户名/密码才能改这个页面, 研究下数据库里的这3个表:
dashboard
dashboard_acl
user