使用.NET Core搭建分布式音频效果处理服务(七)使用Docker压榨性能极限

简介: Docker相信很多朋友都使用过,做微服务比虚拟机还好用。   需要安装的一些东西 ffmpeg: docker pull ffmpeg dotnet: docker pull dotnet 默认全是latest最新即可,具体怎么配置网上搜索一下即可。

Docker相信很多朋友都使用过,做微服务比虚拟机还好用。

 

需要安装的一些东西

ffmpeg:

docker pull ffmpeg

dotnet:

docker pull dotnet

默认全是latest最新即可,具体怎么配置网上搜索一下即可。

 

调用用REST? 还是用RPC?

微服务之间的接口调用通常包含两个部分,序列化和通信协议。常见的序列化协议包括json、xml、bytes等;通信比较流行的是http、soap、websockect,RPC通常基于TCP实现,常用框架例如dubbo,netty、thrift。

REST:严格意义上说接口很规范,操作对象即为资源,对资源的四种操作(post、get、put、delete),并且参数都放在URL上。

RPC:即我们常说的远程过程调用,就是像调用本地方法一样调用远程方法,通信协议大多采用二进制方式。

一般来说,对内选择rpc,因为他是直接基于TCP/IP协议通讯,性能要好很多。对外选择REST,因为他是更规范的、更标准的、更通用的、更简单的。

但是对于追求较高性能的RPC,会消耗额外很多成本,因此有时候对内一般也采用REST。

因此,笔者为了偷懒o(∩_∩)o ,在这个项目中选择REST,而抛弃RPC那臃肿的调用方式。

 

发布你的应用

dotnet 已经完全可以跨平台,但是如果直接用bin下面将文件夹拷贝到指定的地方,那么你将得到无数抓狂的错误,这是因为netcore和 net framewor本身的不同而造成,前者提供的是基础平台、让使用者自行去开发和扩展相应模块、且开源,而后者是所有东西都已经为你打包到他的集合中去了,你只管调用NET系统根目录中相应的库即可。

比如你需要发布到linux平台,进入你的项目主目录。执行:

dotnet publish -r linux-x64

注意:从dotnet core 2.1开始,发布的时候已经不再需要先还原源码包(dotnet restore)。

进入到publish文件夹(一般在bin下),你会发现多了一些runtime库和一些你根本就没引用的库,这样才能有效的在其他操作系统上直接运行。

 

运行你的应用

你可以通过主机docker命令并附加子命令来运行docker内的dotnet程序,例如这样:

docker run -dit \
-p 50532:80 \
-v /home/dotnet/Service:/wwwroot \
-w /wwwroot \
--restart always \
--name dotnet_service \
6d25f57ea9d6 \
dotnet Service.Web.Api.dll

-p:内外端口映射

-v:内外路径映射

-w:工作目录

6d25f....:你的dotnet镜像名称。

但笔者启动的程序需要附带大量的参数,而且不喜欢这样通过docker宿主进行命令输入,启动中有没有报错不能及时反馈(docker启动镜像返回的是一组hash代码,不会返回程序的的任何启动信息,需要通过docker log查阅),这样就变成如下操作:

进入在docker中的dotnet容器(成功运行镜像后都会成为一个容器),找到与你项目相关的主程序集文件,例如笔者是Service.Web.Api.dll,执行dotnet Service.Web.Api.dll(当然你也可以附带一大堆的启动参数,例如笔者这样)便可以运行这个项目。

dotnet Service.Web.Api.dll
--ASPNETCORE_ENVIRONMENT=Development
--ASPNETCORE_URLS=http://localhost:5052
--USE_CONTENTS_DIRECTORY=/home/netcore.MicroService/src/Service.Web.Api

小技巧:linux上面SSH相信大家有耳熟能详,但是一旦关闭控制台,运行的后台也将随之关闭,我们可以通过安装screen建立一个虚拟子屏幕,以保证shell程序在后台能一直运行下去。

 

保存你的netcore容器到镜像

如果我们需要在一台服务器上面建几十个docker容器,每一个都像上面那样进行一步一步的手动输入,那不是要崩溃...

我们保存一个已经在运行的容器,修改他子程序的运行参数,例如修改映射端口号,就可以实现快速的多个相同镜像的目的。使用命令:

docker commit c16378f943fe service_media

c1637...:这是笔者这边已经在运行的容器实例。

接下来再执行“运行你的应用”中的命令,将外部映射端口改成你想要的端口号,不断的重复这个操作,即可在同一台服务器上运行多个实例。

 

为何要选择docker进行实例运行

有的朋友也许不明白为何要这样做重复的操作,直接用dotnet自带的宿主,复制多条相同的命令,修改端口号一样也能达到如上的需求。

是的,这样的确也可以在同一台服务器上运行多个主机宿主实例,但是,他们并没有隔离。

对,就是这个词语----隔离:

说到这个词语可以牵涉一堆专业术语,而笔者又不想太多去复制太官方的东西,喜欢用白话文介绍自己所理解的内容。

当所有的子程序都运行在主机(非docker)下,内存分配,IO读取,系统底层调用等等一些处理,都会交给主机操作系统执行,这样会存在一定的风险。而docker虽然运行在主机之上,可他却有一套自己的底层进行处理,这样带来第一层隔离,其次,运行在docker容器内的程序,容器本身也是一个操作系统,不外乎是被建立镜像的时候将操作系统进行了大范围的瘦身,只保留该TAG需要的LIB就行,这样又做了一层隔离。

具体详细的隔离架构,朋友们可网上搜一搜,很多的。

 

运行多个docker dotnet core镜像

上面噼里啪啦的说了一大堆,其实就是一张图片就解释的事情:

笔者用了三台服务器做处理服务,每台上面运行相同的docker实例32个,总共3*32=96个实例(全傻瓜式的水平扩展),通过客户端模拟100个请求,得到结论如下:

反而比单机模拟6台服务器性能降低了3%-6%,但是:

1:单机一次请求是8个,而在该系统测试中,一次请求是100个。

2:单次时间变长,是因为服务器的U比本地测试的U的主频低,但是核心却是本地U的4倍。

这样一来,其实整体性能会随着服务器的数量的添加而增加,根据业务需求而定吧,就说目前某度云的视频转换最高请求也就是几千左右,如果真有那个量级,傻瓜式的增加服务器就行了。

 

本系列完,感谢阅读

相关文章
|
4月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
160 3
|
7天前
|
Linux Docker 容器
Linux 中停止 Docker 服务报 warning 导致无法彻底停止问题如何解决?
在 Linux 系统中,停止 Docker 服务时遇到警告无法彻底停止的问题,可以通过系统管理工具停止服务、强制终止相关进程、检查系统资源和依赖关系、以及重置 Docker 环境来解决。通过以上步骤,能够有效地排查和解决 Docker 服务停止不彻底的问题,确保系统的稳定运行。
42 19
|
2月前
|
人工智能 弹性计算 监控
分布式大模型训练的性能建模与调优
阿里云智能集团弹性计算高级技术专家林立翔分享了分布式大模型训练的性能建模与调优。内容涵盖四大方面:1) 大模型对AI基础设施的性能挑战,强调规模增大带来的显存和算力需求;2) 大模型训练的性能分析和建模,介绍TOP-DOWN和bottom-up方法论及工具;3) 基于建模分析的性能优化,通过案例展示显存预估和流水线失衡优化;4) 宣传阿里云AI基础设施,提供高效算力集群、网络及软件支持,助力大模型训练与推理。
|
2月前
|
机器学习/深度学习 分布式计算 数据挖掘
MaxFrame 性能评测:阿里云MaxCompute上的分布式Pandas引擎
MaxFrame是一款兼容Pandas API的分布式数据分析工具,基于MaxCompute平台,极大提升了大规模数据处理效率。其核心优势在于结合了Pandas的易用性和MaxCompute的分布式计算能力,无需学习新编程模型即可处理海量数据。性能测试显示,在涉及`groupby`和`merge`等复杂操作时,MaxFrame相比本地Pandas有显著性能提升,最高可达9倍。适用于大规模数据分析、数据清洗、预处理及机器学习特征工程等场景。尽管存在网络延迟和资源消耗等问题,MaxFrame仍是处理TB级甚至PB级数据的理想选择。
55 4
|
2月前
|
消息中间件 存储 安全
分布式系统架构3:服务容错
分布式系统因其复杂性,故障几乎是必然的。那么如何让系统在不可避免的故障中依然保持稳定?本文详细介绍了分布式架构中7种核心的服务容错策略,包括故障转移、快速失败、安全失败等,以及它们在实际业务场景中的应用。无论是支付场景的快速失败,还是日志采集的安全失败,每种策略都有自己的适用领域和优缺点。此外,文章还为技术面试提供了解题思路,助你在关键时刻脱颖而出。掌握这些策略,不仅能提升系统健壮性,还能让你的技术栈更上一层楼!快来深入学习,走向架构师之路吧!
71 11
|
2月前
|
Prometheus 监控 Cloud Native
如何监控Docker Swarm集群的性能?
如何监控Docker Swarm集群的性能?
135 8
|
2月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
191 7
|
4月前
|
负载均衡 应用服务中间件 网络安全
docker swarm添加更多的服务
【10月更文挑战第16天】
45 6
|
4月前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
71 5
|
4月前
|
负载均衡 网络协议 关系型数据库
docker swarm 使用网络启动服务
【10月更文挑战第15天】
51 4

热门文章

最新文章