cpu时间

关于JVM案例分析(三)

爷,独闯天下 提交于 2020-02-12 14:51:30
CPU分析篇 CPU 性能分析的主要目的是统计函数的调用情况及执行时间,或者更简单的情况就是统计应用程序的 CPU 使用情况。 没有程序运行时的 CPU 使用情况如下图: 运行一段 占用CPU 的小程序,代码如下 package jvisualVM; public class MemoryCpuTest { public static void main(String[] args) throws InterruptedException { cpuFix(); } /** * cpu 运行固定百分比 * * @throws InterruptedException */ public static void cpuFix() throws InterruptedException { // 80%的占有率 int busyTime = 8; // 20%的占有率 int idelTime = 2; // 开始时间 long startTime = 0; while (true) { // 开始时间 startTime = System.currentTimeMillis(); /* * 运行时间 */ while (System.currentTimeMillis() - startTime < busyTime) { ; } // 休息时间 Thread.sleep

Java多线程(二)

最后都变了- 提交于 2020-02-12 11:33:30
个人博客 http://www.milovetingting.cn Java多线程(二) 前言 本文为学习Java相关知识所作笔记,参考以下资料: https://github.com/Snailclimb/JavaGuide ,感谢原作者的分享! JAVA 锁 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。 java 中的乐观锁基本都是通过 CAS 操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。 悲观锁 悲观锁是就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据的时候都认为别人会修改,所以每次在读写数据的时候都会上锁,这样别人想读写这个数据就会 block 直到拿到锁。java中的悲观锁就是Synchronized,AQS框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如 RetreenLock。 自旋锁 自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态

CLR via C# —— 线程

与世无争的帅哥 提交于 2020-02-12 11:06:02
线程的作用 早期的操作系统没有 "线程" 的概念, 例如16位的 Windows 就是一个不支持多线程的操作系统. 这样的系统有一个特征: 整个系统同时只运行着一个任务, 包含操作系统代码还有应用程序的代码. 这带来了一个问题: 如果当前运行的这个任务需要很长一段时间才能执行完成, 它就会阻止其它任务执行. 如果某个程序含有 bug , 程序进入了一个死循环, 用户只好重新启动电脑了. 这样的操作系统显然很不给力, 微软决定改进操作系统内核, 让它的健壮性, 可靠性, 扩展性以及安全性都要得到提高. 微软从1988年11月开始编写 Windows NT, 微软在设计这个系统内核的时候, 决定在一个进程中运行应用程序的每个实例, 进程则是应用程序的一个实例要使用的资源的集合. 每一个进程被赋予了一个虚拟地址空间, 确保一个进程无法访问另一个进程的代码和数据. 因为一个进程无法破坏另一个进程的代码和数据, 所以系统的健壮性提高了; 程序无法访问另一个应用程序的用户名, 密码等信息, 因此安全性提高了. 虽然数据无法被破坏, 而且更安全, 但如果一个应用程序进入无限循环, 机器只有1个 CPU 的话, CPU 就会执行无限循环, 系统仍然会停止响应. 微软修正这个问题的办法就是 "线程". 线程的职责是对 CPU 进行虚拟化 , Windows 为每个进程都提供了该进程专用的线程

linux设备驱动编程之并发控制

谁都会走 提交于 2020-02-12 04:44:48
1.什么是并发? (1)什么是并发? 所谓的并发控制便是多个进程同时进行,并行的对内核资源(全局变量,静态变量等)访问而出现竞态。竞态简单的说就是两个或两个以上的进程同时访问一个资源,同时引起资源的错误. 例如:如下图,按照进程1代码逻辑设计意图,赋值进程变量a为100,并且执行代码x,但是就在这时候进程1不知道进程2也在并发访问全局变量a并赋值为200,这样以来那么进程1的代码并不会执行.程序出现意想不到的错误.而这就是并发访问导致的错误. 2.并发的原因? 并发的原因有种,主要包含如下 (1)对称多处理器(smp)多个cpu 如下图,当多个cpu同时访问一个全局变量的时候便会出现静态 (2)单个cpu抢占其他进程 当一个进程资源在自己的时间戳片消耗完成或者被其他高优先级进程抢占后访问其共享资源变回类似与smp.因为linux内核有着"宏观串行,微观串行"的执行流程. (3)中断 当进程正在访问共享资源的时候,由于中断打断了,并且中断服务程序也对共享资源进行访问导致了竞态. (4)编译乱序以及执行乱系 (这个后续比较复杂,后续有时间再做笔记解说) 3.并发控制的方法 为了避免上面的并发访问导致了竟态,我们控制并发的方法很简单,当一个进程访问共享资源之前,需要加一把锁或者一个访问状态,告诉其他进程当前进程正在访问,需要排队等待

JVM-GC调优,一文详解JDK监控和故障处理命令及常见故障分析

时光总嘲笑我的痴心妄想 提交于 2020-02-10 20:42:15
本文转载自: JVM-GC调优,一文详解JDK监控和故障处理命令及常见故障分析 JVM 的定位系统问题时,知识和经验是关键基础,数据是依据、工具是运用知识处理数据的手段 数据包括:运行日志、异常堆栈、GC日志、线程快照(thread dump、javacore文件)、堆转储快照(headdump / hprof 文件) 一、调优命令 JDK监控和故障处理命令,在bin目录下有: jps、 jstat、jmap、jhat、jstack、jinfo jps:显示虚拟机进程,常用如: jps -l -v jstat:收集虚拟机各方面的运行数据,常用如: jps-gcutil 2764 、 jstat -gc 2764 250 20 jinfo:显示虚拟机配置信息 jmap:生成虚拟机内存转储快照(headdump 文件),常用如: jmap -dump:live,format=b,file=dump.hprof 28920 jhat:用于分析headdump 文件,他会建立一个http/html 的服务器,让客户可以在浏览器上查看分析结果,常用如: jhat dump.hprof jstack: 显示虚拟机线程快照,常用如: jstack -l 11494 下面做一 一介绍 二、Jps 显示指定系统内所有的HotSpot虚拟机进程, 格式 : jps - [hostid] options

计算机是怎么跑起来的?

筅森魡賤 提交于 2020-02-10 17:28:36
01 在学习工作中,经常会遇到些让我脑子短路无法回血的问题? 你去评估下这项目需要几台机器能维持稳定性,CPU要几核,内存要多大? X模块偶发出现内存飙升的情况,你追查下原因顺便想想如何优化? 瞬间,鸦雀无声甚至气氛一度及其尴尬。作为一个CURD男孩,写代码就是一把梭复制粘贴,那能管那么宽?仔细一想,我也是学过计算机组成原理、操作系统原理的男孩,岂能说怂就怂? 这时,冯·诺依曼、寄存器、内存、二进制、补码这些词忽隐忽现的飘过,就像一堆杂乱无章的思绪挤地铁一样挤入我的脑海。然而,我发现这跟上面的问题并没有丝毫联系,放佛我有一把方天画戟却切不动一盘菜的感觉,并没有什么用。 我相信,大多数同学在熟练编写业务代码后,会在出现一些复杂问题后被委以重任,这就非常考验大家的基本功了。 于是,我趁疫情在家时间充裕,花了一些时间阅读书籍和思考,尝试再去总结下计算机的基础知识。 02 首先,我先从计算机的三大原则开始说起。 1. 是什么?计算机是执行输入、运算、输出的机器 计算机本质上就是一台机器,机器的工作模式:接收指令(输入)、理解指令(运算)、做出动作(输出)。 工作模式很简单,关键是计算机如何理解指令的呢? 举个例子:在一个阳光明媚的早上,你对你对象说:不去上班行不行?你对象娇滴滴的回答:不去上班你养我啊? 针对这桥段,你仔细想想你对象脑子里是怎么流转的? 输入:声音(汉语) 理解:

MySQL my.cnf详解

你说的曾经没有我的故事 提交于 2020-02-10 12:27:14
1 #*** client options 相关选项 ***# 2 #以下选项会被MySQL客户端应用读取。注意只有MySQL附带的客户端应用程序保证可以读取这段内容。如果你想你自己的MySQL应用程序获取这些值。需要在MySQL客户端库初始化的时候指定这些选项。[client] 3 port = 3306 4 socket = /usr/local/mysql/tmp/mysql.sock 5 [mysqld]!include /usr/local/mysql/etc/mysqld.cnf 6 #包含的配置文件 ,把用户名,密码文件单独存放 7 port = 3306 8 bind-address = 0.0.0.0 9 server-id = 1 10 #表示是本机的序号为1,唯一 11 socket = /usr/local/mysql/tmp/mysql.sock 12 pid-file = /usr/local/mysql/var/mysql.pid 13 basedir = /usr/local/mysql/ 14 datadir = /usr/local/mysql/var/ 15 tmpdir = /usr/local/mysql/tmp/ 16 #此目录被 MySQL用来保存临时文件.例如,它被用来处理基于磁盘的大型排序,和内部排序一样,以及简单的临时表

python语法基础-并发编程-线程-长期维护

假装没事ソ 提交于 2020-02-10 05:54:29
############### 线程和GIL,全局解释器锁 ############## """ 线程 为什么会有进程? 主要是能够同时处理多个任务,多个任务还要进行切换,时间片轮转 为什么会有线程? 进程并不是执行任务的最小单元,每一个进程里面有都一个线程,我们叫做主线程, 早期没有线程,一个进程只能干一个任务,如果有多个任务,只能多起进程,进程太多不行的, 进程内部的内存是共享的,所以需要线程,否则还要涉及到进程间的通信,这比较浪费资源 所以线程的出现解决了两个问题: 1,进程内部的通信 2,一个进程可以处理多个任务, 线程的开销比进程少,可以认为是一个轻型的进程, 进程可以任务是车间,线程可以认为是每一个工人, 进程是资源分配的最小单位,线程是cpu调度的最小单位, ########################### 进程和线程的区别: 1,进程之间的内存是独立的,但是一个进程之内的线程是可以共享的, 2,进程之间切换是慢于线程之间的切换的, """ # 第一个例子 from threading import Thread import time,os # 多线程并发 # def func(n): # 这是子线程完成的 # time.sleep(1) # 虽然是打印了10次,但是只等待了1秒,所以10线程之间是并发的, # print(n) # # for i in

售票系统与多线程

瘦欲@ 提交于 2020-02-10 04:50:33
1. 需求 有三个窗口同时卖票à并行 共101张票,票号从1到101 2. 线程的概念 在写代码之前我们先来复习一下线程的基本概念。 进程: 是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者称为一个控制单元。当程序运行时,会开辟一段内存空间,进程就是用来定义和标识内存空间,并封装其中的控制单元。 线程: 是真正执行的部分,是进程中的一个独立的控制单元。线程在控制着进程的执行。 (1) 一个进程中至少有一个线程。 (2) JAVA虚拟机进程至少有两个线程:主线程和垃圾回收线程。主线程执行的代码是在main中。 (3) 线程的 创建 有两种方式: 继承 Thread 类 并重写 Thread 类的 run 方法 ; 实现 Runable 接口。 (4) CPU 在线程之间切换 。线程通过抢夺CPU执行权来执行。 (5) 多线程具有随机性:CPU执行权通过抢夺,具有随机性。至于执行多长时间,是有CPU决定。 线程演示: 通过继承 Thread类 并重写Thread类的run方法方式创建一个线程类,并在main方法中执行该线程。观察开启的自定义线程和主线程的并行执行效果。 自定义线程类: public class DemoThread extends Thread{ //java 中提供的自定义线程类的方式 @Override public void

hadoop 集群调优实践总结

不问归期 提交于 2020-02-10 03:12:37
调优概述 # 几乎在很多场景,MapRdeuce或者说分布式架构,都会在IO受限,硬盘或者网络读取数据遇到瓶颈.处理数据瓶颈CPU受限.大量的硬盘读写数据是海量数据分析常见情况. IO受限例子: 索引 分组 数据倒入导出 数据移动和转换 CPU受限例子: 聚类/分类 复杂的文本挖掘 特征提取 用户画像 自然语言处理 我们需要从硬件规划和软件规划等多方面结合实现性能和效率的提升。 硬件规划 # 评估集群规模 # 我们需要搭建多少节点的hadoop集群?回答这个问题考虑的因素比较多:预算?数据量?计算资源? 需要多少计算资源可能不是特别好评估,推荐横向扩展,随业务规模和应用发展再考虑扩展。开始可以就按照数据量来评估数据规模,估计一下每天的数据增量?保存数据的周期是多少?有没有冷数据方案? 假设每天增长的数据为600G、3备份存储,以一年规划为例,大概存储为600G 3 360天=633T, 再考虑增加%20的预留,考虑未来数据增长的趋势,考虑应用计算等空间需求。为节省空间可考虑压缩存储(大概可以节省70%空间)。 同时考虑一定冗余量,如果集群一部分节点不可用也要保证业务正常使用(根据集群规模评估冗余比例)。 然后结合节点硬件规划和预算,确定集群规模。假如我们需要650T存储,可以采用30台12 x 2TB的存储配置或者 60台6 x 2TB配置,但是节点数量翻翻