鲲鹏云应用
需三台服务器配置根据要求改,一台x86架构的centos,一台arm架构的centos和openEuler1.安装鲲鹏应用开发工具DevKit要求:安装到home下,并且解压完文件属组为当前操作用户(root)#--no-same-owner是更改成当前使用操作系统用户的权限作为文件所属(背)2.以web方式安装一路回车到底关闭防火墙3.安装待迁移软件ragel要求:安装到/opt路径下4.用po
模块一鲲鹏云应用移植
任务一
需三台服务器配置根据要求改,一台x86架构的centos,一台arm架构的centos和openEuler
1.安装鲲鹏应用开发工具DevKit
要求:安装到home下,并且解压完文件属组为当前操作用户(root)
cd /home
wget https://techsaas-experiment-resources.obs.cn-north-4.myhuaweicloud.com/kunpeng-competition/Porting-advisor_23.0.RC2_linux-x86-64.ta....gz
tar --no-same-owner -zxf Porting-advisor_23.0.RC2_linux-x86-64.ta....gz
#--no-same-owner是更改成当前使用操作系统用户的权限作为文件所属(背)
2.以web方式安装
cd Porting-advisor_23.0.RC2_linux-x86-64
./install web
一路回车到底 关闭防火墙
3.安装待迁移软件ragel
要求:安装到/opt路径下
cd /opt
wget https://techsaas-experiment-resources.obs.cn-north-4.myhuaweicloud.com/kunpeng-competition/ragel-6.10.tar.gz
tar -xvf ragel-6.10.tar.gz
cd ragel-6.10
cat README #安装说明,根据里面的最后三行进行编写
./configure --prefix=/opt #把软件安装到opt目录下
make 执行编译
yum install -y gcc-c++ //如果编译失败安装下gcc包
cd /opt/bin/ //编译成功后在opt中会有创建个bin目录下有个ragel
4.用porting-advisor进行软件迁移评估
软件迁移评估-分析已安装软件-路径/opt/bin/ragel
任务二鲲鹏平台重构kafka软件包
在ARM-CentOS安装鲲鹏应用开发工具Devkit,对kafka进行重构
要求:在/home目录下载安装鲲鹏应用开发工具Devkit
cd /home
wget https://techsaas-experiment-resources.obs.cn-north-4.myhuaweicloud.com/kunpeng-competition/Porting-advisor_23.0.RC2_linux-Kunpeng.t....gz
tar --no-same-owner -xvf Porting-advisor_23.0.RC2_linux-Kunpeng.t....gz
cd /Porting-advisor
./install web
在浏览器输入https://ip:8084
1.点击软件迁移评估-分析软件包
2.执行软件迁
2.下载kafka软件包
cd /opt/portadv/portadmin/package
wget https://techsaas-experiment-resources.obs.cn-north-4.myhuaweicloud.com/kunpeng-competition/kafka-2.4.1-1.el7.noarch.rpm
点分析报告信息之后再复制依赖环境链接
再点软件包重构把下载的kafka软件包复制一份到相应路径
cp kafka-2.4.1-1.el7.noarch.rpm ../packagerebuild/
配置依赖环境(路径:/opt/portadv/portadmin/data)
mkdir /opt/portadv/portadmin/data
cd /opt/portadv/portadmin/data
wget https://mirror.iscas.ac.cn/kunpeng/maven/org/rocksdb/rocksdbjni/5.18.3/rocksdbjni-5.18.3.jar //下载刚才复制的依赖环境
yum install -y rpmrebuild//rpmrebuild也是依赖组件
点击重构
任务三 汇编代码迁移2048游戏
在rpm-openEuler中完成
1.下载待迁移源码并分析
先下载迁移工具和前面步骤一样 /openEuler中yum仓库有问题需把gpgcheck改为0
点击代码迁移,之后在对应的目录下载2048游戏
cd /home
wget https://techsaas-experiment-resources.obs.cn-north-4.myhuaweicloud.com/kunpeng-competition/2048.tar.gz
tar -xvf 2048.tar.gz
mv /home/2048/* /opt/portadv/portadmin/sourcecode/
在迁移工具中点击so_src src 点击分析
在生成的分析视图中点源码迁移建议,在对应目录进行修改
vim /opt/portadv/portadmin/src/main.c
更改一下配置:
__asm__(
"mov x0, xzr \n\t"
"mov x1, %[ARG0_64] \n\t"
"mov x2, %[ARG1_64] \n\t"
"str wzr, [x1]\n\t"
"str wzr, [x2]\n\t"
"b .Lfunc_end_kpt_0\n\t"
".Lfunc_end_kpt_0:\n\t"
:
: [ARG0_64]"r"(&s1), [ARG1_64]"r"(&s2)
: "x0", "x1", "x2"
);
vim /opt/portadv/portadmin/src/Makefile
在第二行编写以下:
-march=armv8.2-a -fsigned-char
vim /opt/portadv/portadmin/so_src/Makefile
-march=armv8.2-a -fsigned-char
在so_src和sourcecode内进行编译
make
生成环境变量(背)
export LD_LIBRARY_PATH=/opt/portadv/portadmin/sourcecode/lib/:SLD_LIBRARY_PATH
生成一个2048点击执行
./2048
鲲鹏应用发布
任务一Maven安装及部署
jdk
1.JDK下载及配置
wget jdk地址
wget https://techsaas-experiment-resources.obs.cn-north-4.myhuaweicloud.com/kunpeng-ecological-application-develop/bisheng-jdk-8u352-linux-aarch64.tar.gz
tar -xvf bisheng-jdk-8u352-linux-aarch64.tar.gz
2.查看一下版本验证是否安装成功
java -version
3.查看目前路径
[root@whb jdk1.8.0_351]# pwd
/wms/jdk1.8.0_351
4.编写环境变量(背)
vim /etc/profile
export JAVA_HOME=/wms/jdk1.8.0_351
export JRE_HOME=/wms/jdk1.8.0_351/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
5.生效环境变量
source /etc/profile
6.验证版本是否正确(如不正确执行下一步)
[root@arm-centos jre]# cd ..
[root@arm-centos bisheng-jdk1.8.0_352]# java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)
6.删除原有环境
rpm -qa | grep jdk
rpm -e --nodeps //查看出来的包都删除(背)
6.再次验证
Java -version
enjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
Maven
1.下载maven
wget https://repo.huaweicloud.com/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
2.解压
tar -xvf apache-maven-3.5.4-bin.tar.gz
3.进入目录查看路径
root@whb apache-maven-3.5.4]# pwd
/wms/apache-maven-3.5.4
4.配置环境变量(背)
vim /etc/profile
export MAVEN_HOME=/wms/apache-maven-3.5.4
export PATH=$PATH:$MAVEN_HOME/bin
5.环境生效
source /etc/profile
6.编辑快速拉取镜像文件
vim /wms/apache-maven-3.5.4/conf/settings.xml
<server>
<id>huaweicloud</id>
<username>anonymous</username>
<password>devcloud</password>
</server>
<mirror>
<id>mirror</id>
<mirrorOf>*</mirrorOf>
<name>cmc-cd-mirror</name>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</mirror>
7.查看版本信息
mvn -v
任务二
1.下载nginx
rpm安装
1.下载
yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl openssl-devel //nginx前置软件
wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.20.1-1.el7.ngx.x86_64.rpm
2.解压
rpm -ivh nginx-1.20.1-1.el7.ngx.x86_64.rpm
3.查看是否安装成功
rpm -qa | grep nginx
源码安装
1.下载
yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl openssl-devel //nginx前置软件
wget https://techsaas-experiment-resources.obs.cn-north-4.myhuaweicloud.com:443/AI-Computing/junior/nginx-1.16.0.tar.gz
2.安装
tar -xvf nginx-1.16.0.tar.gz
./configure
vim ojbs/Makefile
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g #将-Werror删除
vim src/os/unix/ngx_user.c
#cd.current_salt[0] = ~salt[0] #将36行注释,如果没有就不用
cd nginx解压目录
make && make install
3.生效一下环境
/usr/local/nginx/sbin/nginx -t //测试
/usr/local/nginx/sbin/nginx -s reload //重启
重启如果出现此错误:
nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
使用指定nginx.conf方式,用-c重启nginx:
cd /usr/local/nginx/sbin
./nginx -t
./nginx -c /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -s reload //再重启
2.使用maven构建工程骨架
1.在root目录构建工程骨架
cd /root
mvn archetype:generate
一直回车,构建过程当中出现:出现提示:groupId, artfactId ,version,以及包名 看到这些停止输入com.example和huaweidemo
Define value for property 'groupId': com.example
Define value for property 'artifactId': huaweidemo
[INFO] Using property: version = 1.0-SNAPSHOT Define value for property 'package' com.example:: Confirm properties configuration: groupId: com.example artifactId: huaweidemo version: 1.0-SNAPSHOT package: com.example 之后在回车看到输入y就输入
2.安装tree命令,用于查看结构
yum install -y tree
3.查看结构
tree
3.使用spring boot 编写个简单校验功能
基于上面环境
执行完mvn archetype:generate后会在当前目录下创建个huaweidemo,然后按上面结构进行创建文件
使用以下命令按照上图的信息创建目录:
rm –rf test
rm -rf src/main/java/com/example/App.java
cd src/main/java/com/example/
mkdir huaweidemo
cd huaweidemo/
mkdir control personValidating storage
cd storage
touch FileSystemStorageService.java StorageException.java StorageFileNotFoundException.java StorageProperties.java StorageService.java
cd ../control/
touch FileUploadController.java WebConller.java
cd ../personValidating/
touch PersonForm.java
cd .. touch HuaweidemoApplication.java
修改pom.xml文件具体代码主要内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>huaweidemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>huaweidemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
编写HuaweidemoApplication.java代码
package com.example.huaweidemo;
import com.example.huaweidemo.storage.StorageProperties;
import com.example.huaweidemo.storage.StorageService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@SpringBootApplication
@EntityScan("com.example.huaweidemo.personvalidating")
//@ComponentScan(basePackages = "com.example.huaweidemo.control.*")
@EnableConfigurationProperties(StorageProperties.class)
public class HuaweidemoApplication {
public static void main(String[] args) {
SpringApplication.run(HuaweidemoApplication.class, args);
}
@Bean
CommandLineRunner init(StorageService storageService) {
return (args) -> {
storageService.deleteAll();
storageService.init();
};
}
}
编写control目录下的WebConller.java代码,如下:
package com.example.huaweidemo.control;
import com.example.huaweidemo.personvalidating.PersonForm;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.validation.Valid;
@Controller
public class WebConller implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/result").setViewName("result");
}
@GetMapping("/")
public String showForm(PersonForm personForm) {
return "form";
}
@PostMapping("/")
public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) {
return bindingResult.hasErrors() ? "form": "redirect:/result";
}
}
编写personValidating目录下的PersonForm.java代码如下:
package com.example.huaweidemo.personvalidating;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class PersonForm {
@NotNull
@Size(min=2,max=30)
private String name;
@NotNull
@Min(18)
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "PersonForm{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在storage下编写处理代码FileSystemStorageService.java:
package com.example.huaweidemo.storage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.stereotype.Service;
import org.springframework.util.FileSystemUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.stream.Stream;
@Service
public class FileSystemStorageService implements StorageService{
private final Path rootLocation;
@Autowired
public FileSystemStorageService(StorageProperties properties) {
this.rootLocation = Paths.get(properties.getLocation());
}
@Override
public void init() {
try {
Files.createDirectories(rootLocation);
}catch (IOException E) {
throw new StorageException("Could not initalize storager",E);
}
}
@Override
public void store(MultipartFile file) {
try {
if (file.isEmpty()){
throw new StorageException("Failed to store empty file");
}
Path destinationFile = this.rootLocation.resolve(Paths.get(file.getOriginalFilename())).normalize().toAbsolutePath();
if (!destinationFile.getParent().equals(this.rootLocation.toAbsolutePath())) {
throw new StorageException( "cantnot store file outside current directory");
}
try (InputStream inputStream = file.getInputStream()){
Files.copy(inputStream,destinationFile, StandardCopyOption.REPLACE_EXISTING);
}
}catch (IOException e) {
throw new StorageException("Failed to store file",e);
}
}
@Override
public Stream<Path> loadAll() {
try {
return Files.walk(this.rootLocation,1).filter(path -> !path.equals(this.rootLocation)).map(this.rootLocation::relativize);
}catch (IOException e) {
throw new StorageException("Failed to read stored files ",e);
}
}
@Override
public Path load(String filename) {
return rootLocation.resolve(filename);
}
@Override
public Resource loadAsResource(String filename) {
try {
Path file = load(filename);
Resource resource = new UrlResource(file.toUri());
if (resource.exists() || resource.isReadable()) {
return resource;
}else {
throw new StorageFileNotFoundException("Could not read file:" +filename);
}
}catch (MalformedURLException e){
throw new StorageFileNotFoundException("Could not read file:"+ filename, e);
}
}
@Override
public void deleteAll() {
FileSystemUtils.deleteRecursively(rootLocation.toFile());
}
}
编写storage目录下的StorageService.java代码如下:
package com.example.huaweidemo.storage;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;
import java.nio.file.Path;
import java.util.stream.Stream;
public interface StorageService {
void init();
void store(MultipartFile file);
Stream<Path> loadAll();
Path load(String filename);
Resource loadAsResource(String filename);
void deleteAll();
}
编写storage目录下的StorageProperties.java代码如下:
package com.example.huaweidemo.storage;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("storage")
public class StorageProperties {
private String location = "upload-dir";
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
编写storage目录下的StorageFileNotFoundException.java代码如下:
package com.example.huaweidemo.storage;
public class StorageFileNotFoundException extends StorageException {
public StorageFileNotFoundException(String message) {
super(message);
}
public StorageFileNotFoundException(String message, Throwable cause) {
super(message, cause);
}
}
编写storage目录下的StorageException.java代码如下:
package com.example.huaweidemo.storage;
public class StorageException extends RuntimeException{
public StorageException(String message) {
super(message);
}
public StorageException (String message , Throwable cause) {
super(message, cause);
}
}
编写control目录下的FileUploadControlle.java代码如下:
package com.example.huaweidemo.control;
import com.example.huaweidemo.storage.StorageFileNotFoundException;
import com.example.huaweidemo.storage.StorageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.io.IOException;
import java.util.stream.Collectors;
@Controller
public class FileUploadController {
private final StorageService storageService;
@Autowired
public FileUploadController(StorageService storageService) {
this.storageService = storageService;
}
@GetMapping("/files")
public String listUploadController(Model model) throws IOException {
model.addAttribute("files", storageService.loadAll().map(
path -> MvcUriComponentsBuilder.fromMethodName(FileUploadController.class,
"serveFile",path.getFileName().toString()).build().toUri().toString()).collect(Collectors.toList()));
return "uploadForm";
}
@GetMapping("/files/{filename:.+}")
@ResponseBody
public ResponseEntity<Resource> serveFile(@PathVariable String filename) {
Resource file = storageService.loadAsResource(filename);
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=\"" + file.getFilename() + "\"").body(file);
}
@PostMapping("/files")
public String handleFileUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
storageService.store(file);
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded " + file.getOriginalFilename() + "!");
return "redirect:/files";
}
@ExceptionHandler(StorageFileNotFoundException.class)
public ResponseEntity<?> handleStorageFileNotFound(StorageFileNotFoundException exc) {
return ResponseEntity.notFound().build();
}
}
-
-
-
-
-
- 1 创建resources目录
-
-
-
-
在项目的src/main目录下使用以下命令创建resources目录:
mkdir resources
在resources目录下建立templates目录
mkdir templates
templates目录中建立三个html文件
touch form.html result.html uploadForm.html
编写form.html文件
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="#" th:action="@{/}" th:object="${personForm}" method="post">
<table>
<tr>
<td>Name:</td>
<td><input type="text" th:field="*{name}" /></td>
<td th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</td>
</tr>
<tr>
<td>Age:</td>
<td><input type="text" th:field="*{age}" /></td>
<td th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</td>
</tr>
<tr>
<td><button type="submit">Submit</button></td>
</tr>
</table>
</form>
</body>
编写result.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Congratulations! You are old enough to sign up HuweiCde patche
</body>
</html>
编写uploadForm.html文件
<html xmlns:th="https://www.thymeleaf.org">
<body>
<div th:if="${message}">
<h2 th:text="${message}"/>
</div>
<div>
<form method="POST" enctype="multipart/form-data" action="/files">
<table>
<tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr>
<tr><td></td><td><input type="submit" value="Upload" /></td></tr>
</table>
</form>
</div>
<div>
<ul>
<li th:each="file : ${files}">
<a th:href="${file}" th:text="${file}" />
</li>
</ul>
</div>
</body>
</html>
在resources目录建立application.properties文件
touch application.properties
application.properties文件内容如下:
spring.servlet.multipart.max-file-size= 12800KB
spring.servlet.multipart.max-request-size= 12800KB
-
-
-
-
-
- 2 在主目录下执行mvn命令(/root/huaweidemo)
-
-
-
-
mvn clean compile
mvn clean package
-
-
-
-
-
- 1 执行Spring Boot代码。(每次重启都需要执行)
-
-
-
-
cd huaweidemonginx/target/
ls
![]()
java -jar huaweidemo-0.0.1-SNAPSHOT.jar

-
-
-
-
-
- 1 使用ip加端口好的方式访问Spring Boot服务器。
-
-
-
-
输入虚拟机ip地址 +端口访问测试,例如:

-
-
-
-
-
- 1 测试文件上传页面
-
-
-
-
在访问地址后面添加files可访问文件上传页面,具体如下:

-
-
-
-
-
- 1 更改端口,打开另外一个Sping Boot应用服务。
-
-
-
-
java -jar huaweidemo-0.0.1-SNAPSHOT.jar --server.port=8081

输入ip +端口
-
- 配置ngnix负载均衡转发到java交互
-
-
-
- 1 配置ngnix文件实现负载均衡。
-
-
-
- 配置ngnix负载均衡转发到java交互
修改ngnix配置文件,以实现负载均衡:
cd /etc/nginx
vim nginx.conf
添加如下配置文件:
upstream upstream_name {
server 虚拟机ip:开启端口;
server虚拟机ip:开启端口;
}
将server_name参数修改为虚拟机ip地址,修改完成后的配置如下:

配置location信息,具体如下:
location / {
proxy_pass http://upstream_name;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

-
-
-
-
-
- 1 重启nginx。
-
-
-
-
nginx -s reload

-
-
-
-
-
- 1 直接输入IP地址进行访问
-
-
-
-
http:// 192.168.10.26
模块三 任务一服务器自身性能
top
top

第一行:系统时间,已启动的时间,有两个用户登录系统,系统负载平均值百分比0%,4%,1%时间分别为1,5,15分钟
top - 09:49:29 up 13:03, 3 users, load average: 0.34, 0.14, 0.10
第二行:tasks(进程)205个总进程,3个运行进程,202睡眠进程,0个停止进程,0个僵尸进程
Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie
第三行:%CPU(cpu占用率)用户消耗0.7%,内核消耗0.7%,改进优先级进程消耗0%,空闲cpu98.7%,io读写等待消耗0%,硬中断0%,软中断0%,被偷走0%。
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
第四行:Mem(物理内存),总内存1863000,空闲内存总量68760,已使用内存1087992,缓存总量706248
KiB Mem : 1863000 total, 115256 free, 1140476 used, 607268 buff/cache
第五行:swap(交换分区),交换分区总量2097148,空闲量2095604,已使用量1544,可使用交换分区604864
KiB Swap: 2097148 total, 2089404 free, 7744 used. 543556 avail Mem
第六行:Pid:进程id、User:进程所有者、PR:优先级、NI:nice值,值为负优先级高,值为正优先级底、VIRT:虚拟内存、RES:常驻内存、SHR:共享内存
S:进程状态,s代表睡眠,r运行,t停止,z僵尸
%CPU:从上次更新到现在cpu占用时间、%MEM:内存占用率
TIME+COMMAND:时间+名称
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAN
服务器NUMA配置
1.安装numa命令
yum install -y numactl
2.显示当前NUMA状态
numatat

3.查看硬件对NUMA的支持信息
numactl --hardware或numactl -H

第一行:Available,nodes的()里如果是2或多个nodes就说明numa没关掉
第二行:node0核列表
第三行:node0总内存为1819
第四行:node0空闲内存为85
第五行:node distances是个二位矩阵,nodei表示node i到node j的内存的相对距离。比如node0访问node0的内存距离为10
4.查看numa绑定内核
numactl --show

5.显示cpu相关信息
lscpu
网卡信息
1.先下载查询及设置网卡参数工具
yum install -y ethtool
2.显示网卡offload(指的是将一个本来有软件实现的功能放到硬件上来实现)信息
ethtool -k ens33#网卡名
3.显示网卡聚合信息
ethtool -c ens33
4.查询网卡队列数
ethool -S ens33 //网卡名
5.调整网卡中断聚合参数(发送/接收中断延时的时间、产生中断之前接收/发送的数据包数据均为4)
ethtool -C ens33 tx-usecs 4 tx-frames 4 rx-usecs 4 rx-frames 4
tx-usecs:发送中断延时的时间(微妙为单位)
rx-usecs:接收中断延时的时间(微妙为单位)
tx-frames:产生中断之前发送的数据包数量
rx-frames:产生中断之前接收的数据包数量
磁盘性能监控及调优
使用iostat工具查看磁盘信息
1.下载iostat工具查看磁盘信息
yum install -y sysstat
2.只显示磁盘信息
iostat -d
3.以KB为单位显示
iostat -k
4.显示详细信息
iostat -x
5.每两秒显示一次,总共显示三次
iostat -t 2#时间间隔 3#次数
修改磁盘预取值
find / -name read_ahead_kb
echo 8192 > /sys/devices/virtual/bdi/default/read_ahead_kb //查找所有read_ahead_kb都要修改
查看磁盘调度策略
cat /sys/block/磁盘名/queue/scheduler
修改磁盘调度策略
grubby --update-kernel=ALL --args="elevator=调度程序名"
或echo 调度名 > /sys/block/磁盘名/queue/scheduler
任务二 部署性能调优工具
1.下载安装Hyper Tuner性能分析工具(arm架构)
wget https://techsaas-experiment-resources.obs.cn-north-4.myhuaweicloud.com/kunpeng-competition/Hyper-Tuner_23.0.RC2_linux.tar.gz
2.进行解压
tar -zxvf Hyper-Tuner_23.0.RC2_linux.tar.gz
3.进入Hyper_tuner目录
cd Hyper_tuner
4.执行install.sh进行安装
./install.sh
安装时所选都默认
5.安装完后打开浏览器输入https://ip地址:8086 #默认端口为8086。
账号tunadmin,密码自己设置
6.进入界面后点击系统性能分析-进行普通分析-系统全景分析
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)