背景
公司的服务一直是在windows下运行的,本身服务并不复杂,windows性能和稳定性表现也是不错的,有的服务器也快4年没重启过了,运行的还是挺好的。
这次切linux版本,原因只要是
技术的沉淀。服务端从windows到linux转变也算是一种趋势。
使用一些开源库。比如服务的管理、编排、治理…… windows下毕竟小众。
提升下主机性能、稳定性(这个没什么说服力)。
总之,就是要换到linux。
方案一
之前的工作有过跨平台库的架构经验和开发经验,所以方案一无疑就是接口上的跨平台替换。主要是:
通讯库。 IOCP—>boost::asio
数据结构。 CString/CMap —> std::string/map
线程、锁。 _beginthreadex –> std::thread/std::mutex
线程的消息队列。 postthreadmessage–> 自定义消息队列
ini 配置文件的接口。 GetPrivateProfileInt —>IniParser(开源库)
一些开源库。 如log4cpp、json、redis、rabbitmq、libcurl、protobuf、odbc…..本身就是跨平台的
公司原来的一些基础库
总之,难度不大,花点时间就行。
方案二
在替换的过程中,搜到了一个中间件(winehq),官网的说明是这样的:
Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,macOS 及 BSD 等)上运行 Windows 应用的兼容层。Wine 不是像虚拟机或者模拟器一样模仿内部的 Windows 逻辑,而是將 Windows API 调用翻译成为动态的 POSIX 调用,免除了性能和其他一些行为的内存占用,让你能够干净地集合 Windows 应用到你的桌面。
也就是说,wine中间件将windows的一些函数通过posix接口模式实现了,只要wine xxx.exe 就能执行windows的可执行程序。于是就尝试了下,把一些过程记录下。
在centos 上安装wine
1
2
3
4yum install epel-release
yum install wine
wine --version
安装成功制作成docker容器,700M好大,搜了官网资料没找到如何裁剪
将进程的依赖库,如mfc120.dll 复制到linux目录中(windows的库不需要复制,如kernel32.dll)
将xxx.exe 复制到linux目录
执行 wine xxx.exe
喔哦,服务正常运行
剩下的就是如何后台运行?
尝试使用nohup、disown命令,虽然可以在后台运行,但cpu却出奇的高(80%)。采用的方式就是使用screen
start.sh1
2
3
4
5
6
7#! /bin/bash
screen_name=$"hallsvr"
cmd=$"wine hallsvr.exe"
screen -X -S $screen_name quit
screen -dmS $screen_name
screen -x -S $screen_name -p 0 -X stuff "$cmd"
screen -x -S $screen_name -p 0 -X stuff $'\n'
stop.sh1
2
3
4#! /bin/bash
screen_name=$"hallsvr"
cmd=$"wine hallsvr.exe"
screen -X -S $screen_name quit
cpu 稳定在8%左右。
异常、调试:
使用MiniDumpWriteDump可以保持minidump,也可以使用windbg分析这个dmp文件,但却不能保存fulldemp;
调试可以使用winedbg。
稳定性、功能性测试还在继续中,但我其实已经不推荐这个方式了,wine更适合用在有gui界面的程序,服务还是原生跨平台的更好。
总结
方案一