函数运行环境系统动态链接库版本太低?函数计算 fun 神助力分忧解难

背景

最近在处理线上工单的时候,遇到一个用户使用 nodejs runtime 时因为函数计算运行环境的 gcc 版本过低导致无法运行的问题,觉得非常有意思,所以深入的帮用户寻找了解决方案。觉得这个场景应该具有一定的通用性,所以在这篇文章里面重点的介绍一下如何使用函数计算的周边工具 fun 解决因为 runtime 中系统版本导致的各种兼容性问题。

场景介绍

用户问题

简要描述一下用户当时遇到的问题:

用户使用函数计算的 nodejs8 runtime,在本地自己的开发环境使用 npm install couchbase 安装了 couchbase 这个第三方库。couchbase 封装了 C 库,依赖系统底层动态链接库 libstdc++.so.6。因为用户自己的开发环境的操作系统内核比较新,所以本地安装、编译和调试都比较顺利。所以,最后按照函数计算的打包方式成功创建了 Function,但是执行 InvokeFunction 时,遇到了这样的错误:

"errorMessage": "/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /code/node_modules/couchbase/build/Release/couchbase_impl.node)","errorType": "Error","stackTrace": ["Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /code/node_modules/couchbase/build/Release/couchbase_impl.node)",
...

错误发生的原因如堆栈描述,即没有 CXXABI_1.3.9 这个版本,可以看到函数计算 nodejs 环境中的支持情况:

root@1fe79eb58dbd:/code# strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 |grep CXXABI_     
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_TM_1

升级底层系统版本的代价比较大,需要长时间的稳定性、兼容性测试和观察,所以,为了支持这类使用场景,我们希望能够有比较简单的方式绕行。

场景复现和问题解决

前提:先按照 fun 的安装步骤安装 fun工具,并进行 fun config 配置。

在本地很快搭建了一个项目目录:

- test_code/- index.js- template.yml

其中 index.js 和 template.yml 的 内容分别为

# index.js
const couchbase = require('couchbase').Mock;module.exports.handler = function(event, context, callback) {var cluster = new couchbase.Cluster();var bucket = cluster.openBucket();bucket.upsert('testdoc', {name:'Frank'}, function(err, result) {if (err) throw err;bucket.get('testdoc', function(err, result) {if (err) throw err;console.log(result.value);// {name: Frank}});});callback(null, {hello: 'world'})
}# template.yml 
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:fc: # service nameType: 'Aliyun::Serverless::Service'Properties:Description: 'fc test'helloworld: # function nameType: 'Aliyun::Serverless::Function'Properties:Handler: index.handlerRuntime: nodejs8CodeUri: './'Timeout: 60

为了能够在本地模拟函数计算的真实环境进行依赖包安装和调试,这里生成一个 fun.yml 文件用于 fun install 安装使用,内容如下:

runtime: nodejs8
tasks: - shell: |-if [ ! -f /code/.fun/root/usr/lib/x86_64-linux-gnu/libstdc++.so.6 ]; thenmkdir -p /code/.fun/tmp/archives/curl http://mirrors.ustc.edu.cn/debian/pool/main/g/gcc-6/libstdc++6_6.3.0-18+deb9u1_amd64.deb -o /code/.fun/tmp/archives/libstdc++6_6.3.0-18+deb9u1_amd64.debbash -c 'for f in $(ls /code/.fun/tmp/archives/*.deb); do dpkg -x $f /code/.fun/root; done;'rm -rf /code/.fun/tmp/archivesfi  - name: install couchbaseshell: npm install couchbase

fun.yml中参数说明:

  • 前面的分析已经了解到函数计算 nodejs8 runtime 的 libstdc++.so.6 的版本偏低,所以,我们找到一个更新的版本来支持,见新版本的 libstdc++.so.6 的 CXXABI_ 参数:
$strings .fun/root/usr/lib/x86_64-linux-gnu/libstdc++.so.6|grep CXXABI_
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_1.3.9
CXXABI_1.3.10
CXXABI_TM_1
CXXABI_FLOAT128

执行 fun install 命令

安装各种第三方依赖,显示如下:

本地执行情况

执行 fun local invoke helloworld,可以看到执行成功的效果:

$fun local invoke helloworld                              
begin pullling image aliyunfc/runtime-nodejs8:1.4.0...............................................................
pull image finishedpull image finished
FC Invoke Start RequestId: 78e20963-b314-4d69-843a-35a3f465796c
load code for handler:index.handler
FC Invoke End RequestId: 78e20963-b314-4d69-843a-35a3f465796c
{"hello":"world"}2019-02-19T08:16:45.073Z 78e20963-b314-4d69-843a-35a3f465796c [verbose] { name: 'Frank' }

发布上线

使用 fun deploy 发布上线,然后到控制台执行一下线上实际的运行效果:

总结

fun install 功能能够将代码和依赖文件分离开,独立安装系统依赖文件,而且 fun local 和 fun deply 都能够自动帮你设置第三方库的依赖引用路径,让您无需关心环境变量问题。

本文的解法只是提供了一个对于系统版本偏低无法满足用户一些高级库使用需求时的简单绕行方案,仅供参考,对于一些复杂的环境依赖问题,可能还需要具体情况具体分析。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

liunx JMeter 进行压力测试

启动脚本 jmeter.sh -n -t test.jmx -l result.jtl参数说明 - h 帮助 -> 打印出有用的信息并退出 - n 非GUI模式 -> 在GUI模式下进行JMeter测试 - t 测试文件 要运行的JMeter测试脚本文件 - l 日志文件 记录结果的文件 - r 远程执行 启动远程服务 - H 代理主机 设置JMe…

Nginx相关 解决nginx反向代理后页面上的js/css文件无法加载

解决nginx反向代理后页面上的js/css文件无法加载 location ~ \.php$ {proxy_pass http://127.0.0.1:8000;include naproxy.conf;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {expires 30d;proxy_pass http://127.0.0.1:8000;include naproxy.conf;}location ~ .*\.(js|c…

蚂蚁金服核心技术:百亿特征实时推荐算法揭秘

文章提出一整套创新算法与架构,通过对TensorFlow底层的弹性改造,解决了在线学习的弹性特征伸缩和稳定性问题,并以GroupLasso和特征在线频次过滤等自研算法优化了模型稀疏性。在支付宝核心推荐业务获得了uvctr的显著提升,并较大地提…

老码农肺腑直言:为什么我不建议你学Python?

关于Python,我们听到最多的一句话就是:代码简洁。目前来看,代码量上C:Java:Python100:10:1。Python简洁度完胜,但这却也是他的“死亡缺点”!今天想跟大家分享,学Python的一系列惊天大坑……Python钱多“话少…

如何评估深度学习模型效果?阿里工程师这么做

复杂的深度模型中,如果效果不好,是因为网络设计的欠缺?还是数据天然缺陷?是训练代码的bug?还是Tensorflow自身的问题?基于此,阿里工程师推出了DeepInsight深度学习质量平台,致力于解…

Java计算百分比

计算百分比方法,取几位数,括号里面的参数留几个0就行了 String result new DecimalFormat("0.00").format((float) size / total * 100);

开发者如何赶上 5G 风口?

戳蓝字“CSDN云计算”关注我们哦!随着5G正式步入商用,5G 技术引发广泛关注。据信息通信研究院《5G经济社会影响白皮书》预测,2030年,5G将直接带动的总产出、经济增加值、就业机会分别为6.3万亿元、2.9万亿元和800万个。据BOSS直聘…

罗辑思维在全链路压测方面的实践和工作笔记

业务的知名度越高,其背后技术团队承受的压力就越大。一旦出现技术问题,就有可能被放大,尤其是当服务的是对知识获取体验要求颇高的用户群体。 提供知识服务的罗辑思维主张“省时间的获取知识”,那么其技术团队在技术实践方面是如…

能用机器完成的,千万别堆工作量|持续集成中的性能自动化测试

1.背景 当前闲鱼在精益开发模式下,整个技术团队面临了诸多的能力落地和挑战,尤其是效能方面的2-1-1的目标(2周需求交付周期,1周需求开发周期,1小时达到发布标准),具体可见 闲鱼工程师是如何构建持续集成流水线&#x…

获取redis中以某些字符串为前缀的KEY列表

public static final String prefix "helllojava_*"; //这个*一定要加&#xff0c;否则无法模糊查询 Set<String> keys stringRedisTemplate.keys(prefix); for(String key : keys){System.out.println(key); }链接地址&#xff1a; https://blog.csdn.net/l…

详解GPU技术关键参数和应用场景

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Hardy责编 | 阿秃随着云计算&#xff0c;大数据和人工智能技术发展&#xff0c;边缘计算发挥着越来越重要的作用&#xff0c;补充数据中心算力需求。计算架构要求多样化&#xff0c;需要不同的CPU架构来满足不断增长的算力需…

5款神器级别Github 的Chrome插件

文章目录1. Chrome插件一&#xff1a;octotree2. Chrome插件二&#xff1a;sourcegraph3. Chrome插件三&#xff1a;Enhanced GitHub4. Chrome插件四&#xff1a;octolinker5. Chrome插件五&#xff1a;gitzip for github1. Chrome插件一&#xff1a;octotree Octotree是一个 …

Tensorflow源码解析3 -- TensorFlow核心对象 - Graph

1 Graph概述 计算图Graph是TensorFlow的核心对象&#xff0c;TensorFlow的运行流程基本都是围绕它进行的。包括图的构建、传递、剪枝、按worker分裂、按设备二次分裂、执行、注销等。因此理解计算图Graph对掌握TensorFlow运行尤为关键。 2 默认Graph 默认图替换 之前讲解…

用AI说再见!“辣眼睛”的买家秀

阿里妹导读&#xff1a;提起买家秀和卖家秀&#xff0c;相信大家脑中会立刻浮现出诸多画面。同一件衣服在不同人、光线、角度下&#xff0c;会呈现完全不同的状态。运营小二需从大量的买家秀中挑选出高质量的图片。如果单纯靠人工来完成&#xff0c;工作量过于巨大。下面&#…

mysql相关

查询指定时间相近的记录SELECT * abs(UNIX_TIMESTAMP(t.create_time)-UNIX_TIMESTAMP(2020-06-04 10:10:39)) as min from t_video_history t WHERE t.ip 10.0.5.124 GROUP BY min asc limit 1查询一个月之前的数据 select * from t_video_history t where date_format(t.cr…

云+X案例展 | 电商零售类:WakeData助力叁拾加数字化变革

本案例由WakeData投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。在新零售时代下&#…

linux环境安装Kafka最新版本 jdk1.8

文章目录一、环境分布二、实战1. kafka下载2. 解压3. 配置4. 编写启动脚本5. 编写关闭脚本6. 赋予脚本可执行权限7. 脚本使用案例一、环境分布 软件版本jdk1.8kafkakafka_2.13-2.5.0 二、实战 kafka官网地址&#xff1a; http://kafka.apache.org/downloads 1. kafka下载 …

BeanUtils对象之间的复制

1、maven依赖<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version> </dependency>2、常用API // 把orig对象copy到dest对象中. public void copyProperties…

基于泛型编程的序列化实现方法

写在前面 序列化是一个转储-恢复的操作过程&#xff0c;即支持将一个对象转储到临时缓冲或者永久文件中和恢复临时缓冲或者永久文件中的内容到一个对象中等操作&#xff0c;其目的是可以在不同的应用程序之间共享和传输数据&#xff0c;以达到跨应用程序、跨语言和跨平台的解耦…

两大硬件设计被OCP官方接受,腾讯成国内互联网公司第一家

刚刚获悉&#xff0c;腾讯在光网络设备和数据中心领域的两大硬件自研设计“OPC-4”和“TMDC”顺利通过OCP&#xff08;Open Compute Project&#xff09;审核并正式接受为官方开源贡献。这是腾讯在硬件领域的开源设计首次被OCP官方正式认可&#xff0c;同时&#xff0c;腾讯也成…