模块一鲲鹏云应用移植

任务一

需三台服务器配置根据要求改,一台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地址 +端口访问测试,例如:

http://192.168.10.26:8080/

            • 1 测试文件上传页面

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

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

 

输入ip +端口

    1. 配置ngnix负载均衡转发到java交互
            • 1 配置ngnix文件实现负载均衡。

修改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.进入界面后点击系统性能分析-进行普通分析-系统全景分析

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐