文档章节

解惑|你是否为容器监控操碎了心?

数人云
 数人云
发布于 2017/07/11 18:42
字数 4922
阅读 5
收藏 0
点赞 0
评论 0

导读:容器对于物理机和虚拟机,单从监控上看就不是一个数量级的,但监控又是至关重要的,没有监控如同闭眼开车。

本次分享邀请数人云运维总监庞铮,本文将从以下几个方面聊聊容器监控的相关思考:

  1. 容器监控面临问题-容器设计及运营复杂性的挑战;
  2. 容器的三种监控收集指标;
  3. 容器性能监控能力把控及报警调查。

容器监控的问题

为什么要使用Docker

  • 需要一个可靠可扩展的基础设施平台
  • 大量的流量和用户
  • 大量的内部服务
  • 不需要改造基础设施:负载均衡、HTTP服务、日志系统、数据库、监控系统等
  • 抽象标准基础设施服务,如 Haproxy\Mongodb\Es等
  • 提供快速的更新\部署能力

简介

容器对于物理机和虚拟机,单从监控上看就不是一个数量级的。但是监控又是至关重要的,如果没有监控,如同闭着眼开车。先看下传统监控解决的问题:

Markdown

  • 对于应用层:应用层的性能监控将找到代码的瓶颈和错误。
  • 对于基础设施:收集基础设施层的资源指标,如CPU\MEM。

而使用容器则在于资源层和应用层之间,应用监控和基础设施监控无法起作用,造成了监控系统的盲点。

容器的设计

  • 原始初衷:安全

容器最开始设计就是为了提供运行时的安全隔离,且没有虚拟化的资源开销。容器提供了一种孤立运行软件的方法,既不是进程也不是主机,而存在于两者之间。

Markdown

  • 现在

现在使用容器主要有两个重要原因:

  • 提供了一个规模的标准

如果软件是微服务架构,在 Kubernetes\Mesos 等容器平台上进行无停机的扩缩和升级等系统操作。

  • 摆脱对于软件系统的依赖

    一直以来使用 Lib直接编译成二进制可执行文件是最好的,但 Lib 的增加,为了避免内存的过度消耗,导致运行时共享 Lib 的出现。为了解决软件依赖的问题,创建了很多方法如:Apt、Yum、Rvm、V1irtualenv 等,但这会导致拖慢发布周期,而容器直接解决了这个问题。

容器挑战:运营的巨大复杂性

可以将每个容器看成一个迷你的主机,但它与主机的操作并不是很相同。

Markdown

上图显示了15年的系统演进过程。

  • 15年前还是主机天下。
  • 7年前引进虚拟化技术,而虚拟化技术带来的是更好的资源利用率,但对于工程师来说没有什么变化。
  • 而今天 Datadog 的数据显示从收到了数十万的主机数据中,越来越多的主机开始运行容器。
  • 2016年开始使用 Docker 的用户增长率为 40%。

Markdown

  • 运行容器实例主机占总主机数量的 15%。

Markdown

  • 大型企业使用容器的用户更多(超过500台主机集群)占 60%,另一方面说明了容器对于规模性和摆脱软件依赖的对于大型企业的用处更高,数人云的核心业务是帮客户把已有的系统容器化,再将其应用搬到调度系统上,以及开发一些周边系统,接触的客户也反映了这一点。

Markdown

  • 有 40% 的用户将容器运行在类似 Mesos 和 Kubernetes 等容器集群软件中。

Markdown

  • 使用容器用户中在第一个月到第十个月的九个月中,容器数量增长了 5 倍,并且数据非常线性。

Markdown

  • 运行应用统计比例。

Markdown

  • 在使用容器的公司中,每个主机运行容器实例为 7 个左右,而 25% 的公司每个主机运行容器实例为14个左右。

  • 容器的生命周期为 2.5 天,在自动化平台的更短为不到 1 天,主要因为自动修复原因,而非自动平台则 5.5 天。

Markdown

监控的爆炸性增长

在没有容器以前,监控数量如: Markdown

使用容器后公式:假设每个容器收集 50 个度量,再加上应用收集 50 个度量。

系统监控   (容器数量*(容器监控 应用监控))= 每个主机监控数量100         (4 *(50 50))= 500/主机监控项

Markdown

以主机为中心的监控体系

容器作为主机,以主机为中心将有两个问题无法解决:

  • 容器作为主机,因为容器生命周期非常短暂,所以监控系统会认为一半主机在频发故障。

  • 如果不监控容器,那么从主机到应用之间的监控是空白的,产生监控黑洞。

简化监控体系

Markdown

如图采用分层监控架构,更符合现有监控体系。主机层和应用层保持不变使用传统的 Apm 和主机层监控,而容器层使用新的监控模式。

Markdown

如何监控容器

容器类似主机

它有一个迷你主机该有的一切,包含常驻程序、CPU、MEM、IO 和网络资源。但容器不能报告和主机完全相同的 Cgroup 指标。

容器监控资源

cpu

容器 CPU 会给出以下数据而不会有和主机一样的全数据,如 Idle\Iowait\Irq。

Markdown

内存

Markdown

使用内存区别

  • rss

属于进程的数据,如 Stacks、Heaps 等。可以被进一步分解为

  • 活动内存(active_anon)
  • 非活动内存(inactive_anon)

必要时,非活动内存可以被交换到磁盘

  • cache

缓存存储器存储当前保存在内存中的磁盘数据。可以进一步分解为

  • 活动内存(active_file)
  • 非活动内存(inactive_file)

必要时,首先回收非活动内存

  • swap 使用量

io Markdown

容器对于每个块设别汇报4个指标,这种情况下,在主机监控层面跟踪主机队列和服务时间是个好办法,如果同块的队列和服务时间增长,那么因同块 IO 是共享的,所以容器 IO 也受到影响。

  • 读取
  • 写入
  • 同步
  • 异步

网络

和普通主机一样,分为接收和发送的多个度量数据。

Markdown

如何收集容器指标

容器有三种指标收集方法,但标准并不一样:

Sysfs 中的 Pseudo-files

  • 默认情况下,通过Sysfs中的伪文件可以得到容器的度量指标,且不需要 Root 权限。这个方法是最快最清亮的方法。如果需要监控很多主机,速度可能是一个很重要的指标。但无法用这个方法收集到所有指标,如 IO 和网络指标会受到限制。

收集位置

  • 假定伪文件在操作系统目录中的 /sys/fs/cgroup 中,某些系统可能在 /cgroup 中。访问路径包含容器ID。
CONTAINER_ID=$(docker run [OPTIONS] IMAGE [COMMAND] [ARG...] )

CPU 获取方法

cd /sys/fs/cgroupu/docker/&& ll

-rw-r--r-- 1 root root 0 5月  31 10:17 cgroup.clone_children
  --w--w--w- 1 root root 0 5月  31 10:17 cgroup.event_control
  -rw-r--r-- 1 root root 0 5月  31 10:17 cgroup.procs
  -r--r--r-- 1 root root 0 5月  31 10:17 cpuacct.stat
  -rw-r--r-- 1 root root 0 5月  31 10:17 cpuacct.usage
  -r--r--r-- 1 root root 0 5月  31 10:17 cpuacct.usage_percpu
  -rw-r--r-- 1 root root 0 5月  31 10:17 cpu.cfs_period_us
  -rw-r--r-- 1 root root 0 5月  31 10:17 cpu.cfs_quota_us
  -rw-r--r-- 1 root root 0 5月  31 10:17 cpu.rt_period_us
  -rw-r--r-- 1 root root 0 5月  31 10:17 cpu.rt_runtime_us
  -rw-r--r-- 1 root root 0 5月  31 10:17 cpu.shares
  -r--r--r-- 1 root root 0 5月  31 10:17 cpu.stat
  -rw-r--r-- 1 root root 0 5月  31 10:17 notify_on_release
  -rw-r--r-- 1 root root 0 5月  31 10:17 tasks
  • CPU 使用(单位是10毫秒)
# cat $CONTAINER_ID/cpuacct.stat     user 46409 #进程占用  464.09s     system 22162 #系统调用占用 221.62s

CPU 每核使用量

  • 可以帮助识别每个核心的压力
# cat $CONTAINER_ID/cpuacct.usage_percpu         362316789800  #自启动以来占用,单位纳秒         360108180815
  • 如果想要得到对于服务器汇总的cpu指标
# cat $CONTAINER_ID/cpuacct.usage
    722473378982
  • CPU 节流
  • 如果对 CPU 使用做了限制,可以从下面的方法中查看
$ cat /sys/fs/cgroup/cpu/docker/$CONTAINER_ID/cpu.stat
    nr_periods 565 # 已经执行间隔数
    nr_throttled 559 # 被组抑制的次数
    throttled_time 12119585961 # 总使用时间,单位纳秒(12.12s)

内存获取方法

ll /sys/fs/cgroup/memory/docker/$CONTAINER_ID/
  
  # 没有 total 标签,不包含于子cgroup组
  cache 2015232
  rss 15654912
  rss_huge 0
  mapped_file 131072
  swap 0
  pgpgin 22623
  pgpgout 18309
  pgfault 27855
  pgmajfault 7
  inactive_anon 12148736
  active_anon 3506176
  inactive_file 2011136
  active_file 4096
  unevictable 0
  hierarchical_memory_limit 9223372036854775807
  hierarchical_memsw_limit 9223372036854775807
  
  # 有 total 标签,包含于子cgroup组
  total_cache 2015232
  total_rss 15654912
  total_rss_huge 0
  total_mapped_file 131072
  total_swap 0
  total_pgpgin 22623
  total_pgpgout 18309
  total_pgfault 27855
  total_pgmajfault 7
  total_inactive_anon 12148736
  total_active_anon 3506176
  total_inactive_file 2011136
  total_active_file 4096
  total_unevictable 0

可以通过特定命令直接获取一些指标:

# 总物理内存占用 cached + rss ,单位为字节 
  $ cat /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.usage_in_bytes

  # 总物理内存+swap 占用 ,单位为字节 
  $ cat /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.memsw.usage_in_bytes

  # 内存使用次数限制
  $ cat /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.failcnt

  # cgroup 内存限制,单位为字节 
  $ cat /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.limit_in_bytes
  注意如果最终返回的是一个很长的数值代表容器实例并没有限制,如果想增加限制
  $ docker run -m 500M IMAGE [COMMAND] [ARG...]

IO

ll /sys/fs/cgroup/blkio/docker/$CONTAINER_ID
  
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_merged
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_merged_recursive
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_queued
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_queued_recursive
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_service_bytes
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_service_bytes_recursive
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_serviced
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_serviced_recursive
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_service_time
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_service_time_recursive
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_wait_time
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.io_wait_time_recursive
  -rw-r--r-- 1 root root 0 5月  31 10:17 blkio.leaf_weight
  -rw-r--r-- 1 root root 0 5月  31 10:17 blkio.leaf_weight_device
  --w------- 1 root root 0 5月  31 10:17 blkio.reset_stats
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.sectors
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.sectors_recursive
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.throttle.io_service_bytes
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.throttle.io_serviced
  -rw-r--r-- 1 root root 0 5月  31 10:17 blkio.throttle.read_bps_device
  -rw-r--r-- 1 root root 0 5月  31 10:17 blkio.throttle.read_iops_device
  -rw-r--r-- 1 root root 0 5月  31 10:17 blkio.throttle.write_bps_device
  -rw-r--r-- 1 root root 0 5月  31 10:17 blkio.throttle.write_iops_device
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.time
  -r--r--r-- 1 root root 0 5月  31 10:17 blkio.time_recursive
  -rw-r--r-- 1 root root 0 5月  31 10:17 blkio.weight
  -rw-r--r-- 1 root root 0 5月  31 10:17 blkio.weight_device
  -rw-r--r-- 1 root root 0 5月  31 10:17 cgroup.clone_children
  --w--w--w- 1 root root 0 5月  31 10:17 cgroup.event_control
  -rw-r--r-- 1 root root 0 5月  31 10:17 cgroup.procs
  -rw-r--r-- 1 root root 0 5月  31 10:17 notify_on_release
  -rw-r--r-- 1 root root 0 5月  31 10:17 tasks

根据系统不同可能会有更多的指标文件,然而大部分的文件返回值是零。这种情况下通常还有两个可以工作的文件。

  • blkio.throttle.io_service_bytes #io 操作字节,实际操作而非限制,前面两个用冒号分割的数字是-主设备id:次要设备Id。
8:0 Read 2080768
  8:0 Write 0
  8:0 Sync 0
  8:0 Async 2080768
  8:0 Total 2080768
  253:0 Read 2080768
  253:0 Write 0
  253:0 Sync 0
  253:0 Async 2080768
  253:0 Total 2080768
  Total 4161536
  • blkio.throttle.io_serviced #io 操作次数,实际操作而非限制。
   8:0 Read 226
  8:0 Write 0
  8:0 Sync 0
  8:0 Async 226
  8:0 Total 226
  253:0 Read 226
  253:0 Write 0
  253:0 Sync 0
  253:0 Async 226
  253:0 Total 226
  Total 452

想查看设备之间的关系可以使用:

# lsblk
  NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
  sda               8:0    0   50G  0 disk
  ├─sda1            8:1    0  500M  0 part /boot
  ├─sda2            8:2    0 29.5G  0 part
  │ ├─centos-root 253:0    0 46.5G  0 lvm  /
  │ └─centos-swap 253:1    0    3G  0 lvm  [SWAP]
  └─sda3            8:3    0   20G  0 part
  	 └─centos-root 253:0    0 46.5G  0 lvm  /

网络

网络从 1.6.1版本以后才支持,和以上的路径有所不同,获取使用容器Pid获取,注意Host模式获取的是主机网络数据,所以 host 模式无法从容器数据统计网络数据。

$ CONTAINER_PID=`docker inspect -f '{{ .State.Pid }}' $CONTAINER_ID`
  $ cat /proc/$CONTAINER_PID/net/dev 
  
  Inter-|   Receive                                                |  Transmit
  face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
  eth0:    9655      90    0    0    0     0          0         0    31435      78    0    0    0     0       0          0
  lo:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  • cli 的 stats

使用 docker stats 会不断的接收监控指标,1.9.0 以后指标包含磁盘io

  • cpu stats

cpu 占用百分比,多个实例占用cpu会根据分配进行占用峰值,如果设定强制规约,那么cpu只能占设定的数值,比如20%

  • 内存 stats

如果没有明确内存限制,则限制为主机内存限制。如果主机上还有其他使用内存进程,那么会在到达限制前耗尽内存。

  • io stats

1.9.0 版本后支持,显示总读写字节

  • 网络 stats

显示总进/出流量字节

  • api

和 docker stats 命令一样,但是提供更多的细节。守护进程监听 unix:///var/run/docker.sock,只允许本地连接。使用 nc 调用方法:

echo "" | nc -U /var/run/docker.sock 例子 echo -ne "GET /containers/$CONTAINER_ID/stats HTTP/1.1\r\n\r\n" | sudo nc -U /var/run/docker.sock

Markdown

如何监控Docker的性能

监控都需要有什么能力

  • 从每个 Docker 容器收集CPU、内存、IO、网络指标,并可以通过人和标签或者标签聚合做成指标,用来提供高分辨率资源指标。
  • 微服务体系结构中,服务可以直接通讯或者使用队列进行通讯,没有中央负载均衡很难进行计量,通过标签聚合能力可以很好的解决这个问题。
  • 需要通过图形得之哪些服务超载,哪些服务导致其他服务失败,哪些服务流量太多
  • 还可以监控其他非 Docker 服务,如 Haproxy、MongoDB、Es等等。

Markdown

Markdown

报警和调查

内部网络流量变化作为最重要的指标来触发报警而不会引起报警洪水。因此聚合和分解服务级别流量可见性是至关重要的。此外,即使在测量交叉异常阀值前,报警系统也可以提醒网络流量变化。而其余的资源指标是用来调查排错的。

数人云容器监控实践

Markdown

Markdown

Markdown

参考

The Docker monitoring problem

datadog

Runtime metrics

QA

Q:有对Docker本身做什么监控么?

A:可以认为 Docker 监控是类主机监控,只不过是缩小版,基本上分为4部分:CPU、内存、磁盘、网络。

Q:使用的整套监控工具是哪些?容器CPU内存网络 如何监控?容器事件比如起停如何监控。

A:整套工具数人云使用的是Cadvisor + Prometheus + Grafana ,当然中间的组件是可以替换的,但基本上围绕着采集、存储计算、展现来做。采集也可以使用自己的,比如文章说的自己写代理去拿。容器的监控数据当然靠采集程序了。起停这个一般通过监控Docker的事件来实现,采集工具也能收。

Q:分享的监控图片,有数据的,是使用什么监控工具达成的?

A:这个分两种,一种是靠底层的绘图引擎,将数据从存储里读出来自己绘制,一种就是用类Grafana的程序。

Q:如果用Zabbix监控,是否需要定义容器的的历史数据保留时间和趋势数据存储周期,我设定的时历史数据保留7天,趋势数据14天,这样是否合理?

A:我认为Zabbix 是上一代监控体系,或者以主机为中心的监控体系,如果是容器监控,建议还是考虑时序类的监控体系,比如Influxdb\Prometheus等,Zabbix还可以沿用作为主机的,只是Docker单独分离出来,这样基础建设可以复用。

Q:建不建议通过Pod中放一个监控容器来监控应用容器,比如Zabbix客户端的监控容器在Pod中,如果这么做 优缺点哪些?

A:Pod应该是Kubernetes的概念,和容器其实关系不大,这个Kubernetes自己应该会提供数据,具体不是很清楚。但是Abbix还是建议保留在主机层面使用,除非大改,否则即使靠拆分数据库什么的解决,未来维护和性能也是运维大坑。

Q:Cadvisor Heapster 和 Prometheus 哪种好用一些,各自优缺点有哪些。

A: Heapster不熟悉, Prometheus很好,Google个人的开源项目,都是Google套路,唯独存储是个问题,这块还需要看他们未来如何处理,现在单机存储虽然性能上还可以,但是扩展能力比较差。

Q:监控工具推荐哪个?对于容器生命周期短,有何策略应对?如何实现快速监控策略?

A:监控工具推荐刚才已经说了,可以参考数人云的方案然后自己摸索出适合自己的。至于容器生命周期短的问题,这个不就是容器设计嘛,很正常,多起几个相同的服务顶上。

Q:容器的一大特点是IP或者ID信息变化频繁,这就会导致时间序列数据库存储的监控数据量增长和vm相比大上不少,这块有什么应对方案吗?尝试过固定ID的,但是效果不佳。

A:这块确实没有什么好办法,不过可以换个角度,可以将底层的实例抽象一个维度,比如起了1个服务10个容器,把容器编号0-9,对应挂掉的容器,新启动继承这个编号。从时序上用这个作为标记,就能看比较直观的显示了。此功能数人云Swan (欢迎Star&Fork)实现了,可以考虑。

Q:容器的安全如何做监控?

A:这个问题问的好,现在比较通用的监控基本上走的是两条路,一个是监控性能,一个是监控业务,安全层面监控,到现在我觉得还是要靠网络层来监控比较靠谱。

Q:Docker启动Kafka集群的问题,有没有控制内存方面的经验呢?

A:Kafka集群,性能监控的话,可以沿用原来的Kafka集群监控软件,当然如果想做数据汇聚,也可以使用开源软件将数据汇聚到一个数据存储,然后在汇聚出来。关于Docker内存的超出被杀问题,这个主要是看自身对于容器内存设置的容忍度问题,这里可以把容器当成一个机器,看到底给这个机器插多少内存合适。

Q:Promethues有没有做高可用?

A:如果存储高可用的话,可以考虑使用两台Prometheus同时抓,这样数据完全一样,也没啥压力。

分享人庞铮,数人云运维总监。15 年以上运维工作经验。就职过宏碁戏谷、第三波、SQUARE ENIX CO, LTD 等。2015年加入数人云,从事数人云平台运维管理,在容器技术及SRE实践方面有深入研究。

© 著作权归作者所有

共有 人打赏支持
数人云
粉丝 16
博文 101
码字总数 328110
作品 0
朝阳
架构师
安装最新版 Win10 注意:微软提醒你查看隐私设置

最近勒索病毒爆发,微软也是操碎了心。 现在微软发出公告称,对于那些安装最新版Windows 10的用户,一定要检查其隐私设置。这不禁让人想去当年恼人的 “Get Windows 10”弹窗。微软强调,用户...

局长 ⋅ 2017/07/02 ⋅ 6

新入手17款MacbookPro15寸

2018年5月5日,香港沙田新城市广场苹果官方旗舰店购入17款Macbook Pro 15寸手提一台。感谢老婆大人的无条件支持。 先把手上15款Macbook Pro 15寸的简单对比照发一下,用来纪念已经陪伴我三年...

u012540389 ⋅ 05/06 ⋅ 0

乐视网复牌,心疼孙宏斌!

文章来源:壹盐双创 历经9个多月的漫长等待后,乐视网终于迎来复牌。公司1月23日晚间公告,将于1月24日上午开市起复牌。“尊敬的投资者,您好!您持有的乐视网(300104)将于2018年1月24日复...

壹盐双创 ⋅ 01/24 ⋅ 0

Scratch软件是英文版怎么办

少儿编程书籍推荐《轻松玩转Scratch编程》 码盲妈妈的倾诉:最近大家都说,娃娃要学习编程。于是筹划购书,买教程,报培训班。但总得自己先了解下吧。逛遍了网站,询问了百度,查找了知乎,终...

果果老师 ⋅ 2017/11/09 ⋅ 0

AFN 3.0 表单上传图片和文字 iOS 7.0的一些问题

背景:在上一个项目版本中一直使用AFNetworking2.0这个主流的网络请求库,AFHTTPRequestOperationManager从来未让人操心过。在新版迭代中,突发奇想的去升级AFNetworking3.0,使用了AFHTTPS...

Daniel_s ⋅ 2016/05/11 ⋅ 0

真机测试相比模拟器测试好在哪?

对于开发者来说,机型的适配总是让人纠结。开发时,购买真机需要钱,市面上也有像Genymotion这样的模拟器,方便开发者使用的安卓模拟器。诚然模拟器是在缺乏真机的情况下比较靠谱的开发工具,...

12332111ss ⋅ 2015/12/31 ⋅ 0

原来zabbix监控进程与端口是如此的简单!

使用zabbix自带key监控进程与端口 每个公司都有自己的程序,自己的进程名与端口监听,对于nagios来说,这些都经常需要自己去写插件,但是zabbix不需要,它自己就有监控进程与端口的key。 在使...

技术小胖子 ⋅ 2017/11/17 ⋅ 0

你必须非常努力,才能证明自己不是真的无能为力

我手机镜头下的上海外滩 大城市从不睡去,它在不断地见证着来自五湖四海的人们的成功与失败,迷茫与索取。朝九晚五之间,在辉煌的灯光的照耀下,不同的人群演绎者不同的故事,他们在这个陌生...

ZYR_ ⋅ 2017/11/28 ⋅ 0

SpringMVC中的ContextLoaderListener设计困惑

最近在学习Spring MVC原理相关部分,就按顺序从ContextLoaderListener来看,但是我在阅读此类的设计中,遇到了些困惑的地方,现纪录如下,希望能遇到高手能帮我答疑解惑: ContextLoaderLis...

hanzhankang ⋅ 2015/12/25 ⋅ 4

【死磕Java并发】-----J.U.C之Java并发容器:ConcurrentHashMap

此篇博客所有源码均来自JDK 1.8 HashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,put操作是有可能产生死循环的,导致CPU利用率接近100%。为了解决该问题,...

chenssy ⋅ 2017/06/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vim编辑模式、命令模式

编辑模式 vim要从一般模式进入编辑模式只要按字母 i 、I、a、A、o、O键就可以了 要从编辑模式回到一般模式按键盘上的Esc键即可。 按键 作用 i 在当前字符前插入 I 在光标所在行的行首插入 o ...

黄昏残影 ⋅ 28分钟前 ⋅ 0

OSChina 周五乱弹 —— 如果有一天不当程序员了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享off的单曲《我唱情歌给你听》 《我唱情歌给你听》- off 手机党少年们想听歌,请使劲儿戳(这里) @小小编辑 :#如果不做程序...

小小编辑 ⋅ 35分钟前 ⋅ 5

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部