程序员在旅途

用这生命中的每一秒,给自己一个不后悔的未来!

0%

一、性能测试的目标

  性能测试的目标是评估软件系统在各种负载和压力条件下的性能表现,包括响应时间、负载能力、稳定性和可靠性等。实施性能测试需要针对系统的性能指标,建立性能测试模型,制定性能测试方案,在既定的应用环境之下执行性能场景,分析判断性能瓶颈并调优,最终得出性能结果来评估系统的性能指标是否满足既定值。通过性能测试,可以发现并解决系统的性能瓶颈,优化系统设计和实现,提高系统的性能和可靠性,降低系统运行的硬件成本,确保系统能够在不同的负载条件下保持稳定和高效的运行。

二、性能测试的关注点 — 系统吞吐量

  吞吐量是衡量系统性能的一个重要指标,在计算机领域,一个系统的吞度量(承压能力)与CPU的运算能力、外部接口、IO、处理任务的程序质量等紧密关联。当一个计算机系统的CPU运算速度更强,外部接口性能更好,IO传输速度更快、程序算法的质量更高的时候,相应地,系统处理任务的的速度就会越快,吞吐量自然就会上去,这时候我们就会认为系统的性能是更好的。
  当我们想选择一些参数来评估一个系统的性能的时候,经常会见到 TPS和并发数这两个词,TPS指的是 每秒钟系统处理的事务 数量。并发数指的是 系统同时处理的request/事务数。那么这两个参数是如何衡量系统吞吐量的呢?这里需要清楚的是,QPS/并发数=响应时间,系统的响应时间越短,说明系统提供服务的能力越好。但是由于软硬件的限制,每套系统这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,因为系统会超负荷工作,调度程序会更频繁的进行任务上下文切换、内存等其它消耗会导致系统性能下降。

阅读全文 »

一、常用命令总结

1.1 top动态动态展示系统运行状况

top  //从整体上看系统负载及整体资源使用情况,按下1可看所有cpu核心的使用
watch -d uptime  //显示平均负载情况
top -H -p pid  //动态查看一个进程的包含的线程的情况

1.2 ps查看进程信息

ps -ly  //列出与本次登录有关的进程信息
ps -aux  //BSD语法格式
ps -ef  //标准语法格式
ps axjf  //进程关系
ps -T -p pid  //查看一个特定进程的所有线程,其中输出的SID列代表线程ID
ps -eo lstart,pid,stat,%cpu,%mem,command | grep -E ‘^[DR]’ | sort -nr -k3  //查找指定状态的进程(D/R)
ps -q pid -eo lstart,pid,ppid,tid,class,rtprio,ni,pri,psr,pcpu,stat  //打印指定Pid进程的自定义数据

阅读全文 »

一、概述

  在B/S系统的设计与实现中,通知系统的开发是必不可少的一部分。在很多情况下,我们都需要使用通知这个提醒功能,比如,我们写了一篇文章,发了一个动态,这时候有人点赞、评论等,就应该会通知到我们,好让我们了解到他们的反馈,进一步改进我们写的东西。不同的系统对通知的需求和要求都不一样,因此设计方案也会有所差别。通知功能的设计也会随着系统用户的增加而不断的优化,从而达到较高的性能和良好的用户体验。

二、系统设计

  本篇通知系统的设计与实现,采用的是MySQL数据库,Java开发语言,其他的开发语言也类似,这里的设计针对的是用户数量在百万以内的情况,当用户数量巨大的时候,需要考虑的情况就比较复杂了,单单设计几张数据库表是解决不了这个问题的,这时不仅要考虑数据的冗余性,而且还要考虑系统用户的活跃度、消息的时效性等等。根据活跃度,通知需求、时效这些要求的不同,我们还需要设计通知消息不同的获取方式,是主动推送还是被动拉取。当消息量达到一定程度的时候,对于历史消息数据的处理,又是需要认真考虑的问题。这些问题的解决,是随着我们系统的不断升级,用户量不断增加的情况下而逐步进行的,并不需要在系统的设计之初就开始费力去解决这不是核心功能的问题,而且在没有具体应用场景的情况下,我们也很难去针对性的设计系统。

阅读全文 »

一、写作背景

  项目初始版本上线,有时间写点东西记录一下项目中的心得体会,通过这个项目学习了很多,要写下来的有很多,先从评论功能开始吧。由于项目需要增加评论功能,之前并无此方面的经验,因此项目开始的一段时间都在寻思着如何进行评论功能的设计。上网搜索一波发现有很多优秀的第三方评论插件可以使用,本来准备直接采用的,但是心里始终有点疙瘩,可能是评论数据放在别人那里不放心的原因,或可能是想一探这些评论系统的究竟,因此最终决定自行设计开发这么一套评论功能。效果截图如下所示,采用的是MySQL数据库,编程语言用的Java。
  实现效果如下图:
评论功能实现效果图

阅读全文 »

一、条形码的由来

  条形码是由美国的N.T.Woodland在1949年首先提出的.近年来,随着计算机应用的不断普及,条形码的应用得到了很大的发展.条形码可以标出商品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等信息,因而在商品流通、图书管理、邮电管理、银行系统等许多领域都得到了广泛的应用。
  二维条码/二维码(2-Dimensional Barcode)最早发明于日本,是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。 二维条码/二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息。

阅读全文 »

一、Apache Kafka快速入门

Apache Kafka(https://kafka.apache.org)是一个开源分布式事件流平台,设计为处理实时数据提供一个统一、高吞吐、低延迟的平台,其持久化层本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,被广泛应用于高性能数据管道、流分析、数据集成和关键任务应用程序。主要应用场景是:日志收集、消息系统、用户活动跟踪、运营指标、流式处理等.

kafaka 生产消费模型

报错截图

1.1 几个主要概念

Topic​​ :Kafka将消息按照主题进行分类,每个主题可以包含多个消息。主题是Kafka中消息的逻辑容器,生产者将消息发布到特定的主题,消费者订阅感兴趣的主题来消费消息。;
​​Producer​​ :消息生产者,就是向 kafka broker 发消息的客户端;
​​Consumer​​:消息消费者,向 kafka broker 取消息的客户端;
Consumer Group(消费者组):多个消费者可以组成一个消费者组,共同消费一个或多个主题的消息。消费者组可以实现消息的并行处理和负载均衡,每个分区只能由同一个消费者组中的一个消费者进行消费,消费者组可以在消费者客服端指定。
Broker​​ :Kafka集群中的服务器,负责存储和处理消息。一个集群可以由多个Broker组成,一个 broker可以容纳多个 topic。

1.2 单机版Kafka安装部署

Kafka需要使用ZooKeeper提供了分布式协调和管理的能力来实现集群的配置管理、Leader选举、Broker注册和发现以及副本管理等功能,帮助Kafka构建一个可靠、高可用的分布式消息系统。
安装过程中可以选择使用Kafka安装介质自带的ZooKeeper,也可以使用独立的ZooKeeper集群。
需要在Kafka的配置文件config/server.properties中设置zookeeper.connect属性即可。

介质下载

从kafaka官网下载安装介质(https://kafka.apache.org/downloads)(这里以kafka_2.12-3.6.0.tgz为例),下载完以后解压截止到某一目录即可。

阅读全文 »

一、Secret资源对象概述

Secret 是Kubernetes的一个用来保存敏感信息,例如密码、OAuth 令牌和 ssh key的资源对象,它可以让应用程序在容器内使用这些敏感信息,同时又不需要将这些信息直接写在容器配置文件中,将应用中的这些敏感信息放在 Secret 中比放在 pod 的定义中或者 容器镜像中更加安全和灵活。

1.1 Secret的安全性

默认情况下,Secret资源对象以不加密方式存储在集群的 ETCD数据库中。 对API服务器或ETCD有操作权限的情况下都可以对Secret资源对象进行更新等行为,此外,对在Secret的namespaces中有资源操作权限的用户也可以对Secret进行同样权限的行为。

1.2 Secret的类型

一般主要有三种类型的Secret,分别为 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三种类型

Opaque 用户定义的任意数据
kubernetes.io/service-account-token 服务账号令牌,用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。
kubernetes.io/dockerconfigjson ~/.docker/config.json 文件的序列化形式,用来存储私有docker registry的认证信息。

二、Secret的创建

Secret的数据存放在ETCD中,每个 Secret 的尺寸最多为 1MiB,data 字段中所有键值都必须是 base64 编码的字符串。
一般通过以下两种方式创建Secret:

使用 kubectl 命令来创建 Secret;
基于配置文件来创建 Secret。

阅读全文 »

Linux网络配置工具简介

Linux在内核空间围绕TCP/IP协议栈实现了网络接口管理、路由、包过滤等完整网络能力,为了实现对Linux网络的灵活配置,在用户空间,Linux 社区提供了net-tools、iproute2等工具管理 Linux 网络内核功能。其中net-tools起源于BSD的TCP/IP工具箱,通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,主要包括有ifconfig、route、arp和netstat等工具,Linux社区停止了对该工具包的维护。
iproute2 是linux下管理控制TCP/IP网络和流量控制的新一代工具库,通过netlink套接字接口与内核通讯,用于替代传统的 net-tools 软件包,iproute2 提供了一系列的命令,用来查看或操纵 Linux 主机的路由、网络设备、策略路由和隧道等。通过对各类网络资源(如link、IP地址、路由和隧道等)使用合适的对象抽象去定义,从而可以使用一致的语法去管理不同的对象,使得操作更为直观,便捷。
|
Legacy utility Replacement command Note
ifconfig ip addr, ip link, ip -s Address and link configuration
route ip route Routing tables
arp ip neigh Neighbors
iptunnel ip tunnel Tunnels
nameif, ifrename ip link set name Rename network interfaces
ipmaddr ip maddr Multicast
netstat ip -s, ss, ip route Show various networking statistics
brctl bridge Handle bridge addresses and devices

阅读全文 »

一、free命令作用

在大多数Linux发行版中都可以通过 free 命令来查看显示系统内存状态,该命令主要会汇总出包括系统物理内存、swap 交换分区、共享内存和系统缓存的使用情况。这些数据主要是从/proc/meminfo中读出并解析得到。
可以通过free –help 查看该命令的使用方法,也可以通过man free查看该命令的详细操作手册。

二、使用示例

1
2
3
4
[root@docker-registry ~]# free -h
total used free shared buff/cache available
Mem: 2.7G 672M 1.7G 12M 420M 1.8G
Swap: 2.0G 0B 2.0G

参数解析

1
2
3
4
5
6
total 是物理内存大小;
used 是已经使用的内存大小,包括了 buff/cache 和 应用程序实际使用的内存;
free 是空闲的内存数,没有被真正使用的内存空间;
shared 是共享内存大小,共享内存是进程间通信的一种方式;
buff/cache 系统为了提高文件的读写速率而使用的一块内存空间,当应用程序需要使用内存时,这块内存是可以很快被回收而被用户空间程序使用。
available,估算的是当前系统中有多少内存可以用于应用程序的使用,buff/cache占用的内存在有需要的时候是可以被回收的。

available和free的区别

可用内存=系统free memory+buff/cache。free是系统中空闲的内存大小,buff/cache虽然是在需要的时候可以回收的,但是当前也是被利用状态,available统计的是应用程序可用内存空间,buff/cache是可回收,可被应用程序使用的。从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。

buff/cache机制

buff/cache是为了协调内存与磁盘文件读写IO速率差异性、提高系统的工作效率而设计的。
cache
cache 就是缓存的意思。当系统读文件的时候,是把数据从硬盘读到内存里,因为硬盘比内存慢很多,所以这个过程会很耗时。为了提高效率,linux 会把读进来的文件在内存中缓存下来,供程序接下来使用,即使程序结束,cache 也不会被自动释放,系统会根据换出算法把cache缓存置换出去。所以如果有程序进行大量的读文件操作,内存使用率也会相应的提高。

阅读全文 »