资源限制

资源限制指并发编程时,程序受制于计算机硬件资源或软件资源.

  • 网络速度
  • 硬盘读写
  • 数据库连接
  • socket连接

资源限制引发的问题

并发能提升速度的根本原因是改串行执行为并行执行,如果受制于资源,程序无法串行执行,并行执行只能徒增上下文切换及调度开销.

如何解决资源限制

  • 对于硬件资源限制,可以考虑使用集群并行执行程序
  • 对于软件资源限制,可以考虑使用资源池将资源复用

以为受制于资源限制,进行并发编程时要考虑根据资源限制调整并发度.尽量避免线程数远远超出资源限制而产生的线程阻塞.

文章链接 https://fangzongzhou.github.io/2020/09/28/计算机/技术栈/Java/并发编程/资源限制/

上下文切换

单核处理器也支持多线程代码,CPU通过给每个线程分配CPU时间片来实现.

CPU通过时间片分配算法来循环执行业务,任务执行一个时间片后会切换到下一个任务.任务从保存到加载的过程就是一次上下文切换.

上下文切换会影响多线程的执行速度.

并发操作不一定快,创建线程及上下文切换有固有的开销.

测试切换次数及时长

使用 LMbench3 测量上下文切换时长

使用vmstat测量上下文切换次数

1
2
3
4
5
6
vmstat 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
6 0 0 24836616 1829476 41996652 0 0 48 153 0 0 17 8 75 0 0
19 0 0 24830244 1829476 41997324 0 0 0 0 250198 624179 12 8 80 0 0

CS(Content Switch)表示上下文切换的次数

如何减少上下文切换次数

  • 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以处理数据时,可以通过避免使用锁减少上下文切换(例:数据Hash取模分段,不同线程处理不同的数据).
  • CAS算法.(例:Atomic包使用了CAS算法来更新数据,不需要加锁)
  • 使用最少线程.避免创建不需要的线程,线程数创建过多会导致大量线程处于等待状态.
  • 协程:在单线程里实现多任务调度,并在单线程里维持多个任务间的切换

实际操作

用jstack命令dump线程信息

1
jstack 203 > /home/w/www/dump

统计线程状态分布

1
2
3
4
5
6
7
8
grep "java.lang.Thread.State" dump1 | sort | uniq -c

201 java.lang.Thread.State: RUNNABLE
2 java.lang.Thread.State: TIMED_WAITING (on object monitor)
79 java.lang.Thread.State: TIMED_WAITING (parking)
20 java.lang.Thread.State: TIMED_WAITING (sleeping)
3 java.lang.Thread.State: WAITING (on object monitor)
592 java.lang.Thread.State: WAITING (parking)

查看 WAITING (on object monitor)状态的线程的具体情况,例如线程闲置,需要调小线程池容量

文章链接 https://fangzongzhou.github.io/2020/09/25/计算机/技术栈/Java/并发编程/上下文切换/

监控系统

基本概念

监控的定义

通过技术手段发现服务异常,持续优化业务可用性与用户体验。这句话的关键词是 发现、持续优化、可用性,体验。

监控告警是对某一个具化的对象做采集、存储、分析、展示、告警、处理的过程。

一个业务线、一台物理服务器、一个接口都是监控对象,监控对象也是有关联关系的,一个机器挂掉了你不能指望着这台机器上的接口还是健康的吧

Read More

存储第一个事件

原文链接
首先,我们通过运行一个最基础的Logstash pipline来测试你的Logstash.

一个 Logstash pipline 有两个必要元素,inputoutput,和一个可选元素filter,input插件从来源消费数据,filter插件按照你的声明,定制修改数据,output插件将数据写入到目标中.

input-filter-output

最简单的Logstash pipline

1
2
cd logstash-7.9.1
bin/logstash -e 'input { stdin { } } output { stdout {} }'

Read More

Logstash-install

原文链接

下载二进制文件安装

下载地址

通过包仓库安装

APT

1
2
3
4
5
6
7
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

sudo apt-get install apt-transport-https

echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

sudo apt-get update && sudo apt-get install logstash

YUM

1
2
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Read More

信息输出-查询&分析

虽然你可以使用Elasticsearch作为文档仓库来进行获取文档以及元数据,但它真正的优势在于能轻松使用基于Apache Luncene搜索引擎库构建的搜索能力.

Elasticsearch提供一套简单,语义清晰的REST API来管理集群,索引 以及数据查询.为了测试,你可以直接通过命令行或Kibana的开发者控制台提交请求. 根据你的应用,你可以选用如下语言提供的Elasticsearch client ,Java, JavaScript, Go, .NET, PHP, Perl, Python.

查询数据

Elasticsearch REST API 支持结构化查询, 全文本查询,以及结合两者的复杂查询. 结构化查询和在SQL中构建的类型查询类似. 例如,你可以在你的 employee 索引中查询 genderage两个字段,然后通过 hire_date 对匹配结果进行排序. 全文本查询会找出所有匹配查询字符串的文档,并通过相关性(有多匹配你的查询条件)对它们进行排序.

除了单条件搜索,还可以执行短语搜索,相似性搜索,前缀搜索.然后自动获得推荐数据.

是否需要搜索地理位置和其他数字数据? Elasticsearch使用了优化的数据结构对非文本数据进行索引,以此来支持高性能的地理位置及数字查询.

Read More

文档和索引

数据输入:文档和索引

Elasticsearch 是分布式文档仓库. Elasticsearch存储那些已经被序列化成JSON格式的复杂数据. 当在集群中有多个Elasticsearch节点时,存储的文档会被分发到集群中, 并且可以立刻从任意节点进行访问.

当文档被存储后,它会被创建索引,并且能近实时地进行搜索. Elasticsearch 通过一种被称作倒排索引的数据结构来支持快速的全文搜索. 倒排索引包含了所有文档中出现的所有词汇,并标记出包含它的文档.

索引可以被看做文档的优化集合, 每个文档都是字段的集合,它们是包含了你的数据的键值对. 默认情况下, Elasticsearch 中所有字段和字段值都建立了专用的优化过的数据结构. 例如:文本字段存储在倒排索引中,数字和地理位置信息被存储在BKD tree 中,正是因为有了这种通过组装各个字段数据结构来构造查询结果的能力,才使得Elasticsearch如此之快.

Elasticsearch 同时也拥有无模式数据存储的能力, 这意味着通过文档中未显示声明过该如何处理的字段,同样能索引到文档. 当启用动态索引时, Elasticsearch 将自动检测并将新的字段添加到索引中,这种默认行为将使得索引和查找数据都变得简单,只需要开启文档索引,Elasticsearch将监测数据类型,并将它们映射成相应的Elasticsearch数据类型.

Read More

3-Tutorial

本章通过演示如何通过mysql客户端程序创建并使用一个简单的数据库来介绍MySQL,mysql是一个可以连接MySQL服务,执行查询,并能展示结果的交互程序。mysql可以使用批量模式:先将查询放置在文件中,然后告诉mysql执行包含在文件中的命令。这两种使用mysql的方式都会有相应示例。

可以添加--help选项来列出mysql提供的选项

1
mysql --help

本章假定mysql已经安装在你的机器上,并且你可以连接到一个MySQL服务.如果不能连接,请联系你的MySQL服务administrator(如果你就是administrator,你可以参照MySQL Server Administrator中的相关部分)

本章介绍了设置使用数据库的所有过程,如果你只对访问已经存在的数据库感兴趣,你可以跳过那些描述如何创建数据库和表的部分.

本章的本质是教程,因此会省略很多细节.这里涉及的相关主题可以参阅手册的其他相关章节.

Read More