我将Python脚本作为子进程运行,使用Nodejs派生。
当在本地运行时,或者在本地使用Docker/Kubernetes安装时,它会按预期工作,并完成脚本中的所有功能。在Kubernetes Azure中运行容器时,脚本会在不到1小时的时间内自动停止/失败,不会记录任何异常或错误。
内存&CPU使用率保持在最大30%以下,容器作为一个整体不会出现故障。当运行ps -fA | grep python
时,我可以看到脚本在派生后运行。脚本在失败/静默停止后不再显示。Nodejs中派生进程的"exit"one_answers"close"事件不会触发。
任何关于如何排除故障的建议都将不胜感激。
编辑:Nodejs生成
import {/* inject, */ BindingScope, injectable} from '@loopback/core';
const path = require('path');
const spawn = require('child_process').spawn;
@injectable({scope: BindingScope.TRANSIENT})
export class PythonService {
constructor() {}
stopPython(valuationId) {}
executePython(id: string) {
const filepath = path.resolve(process.env.PY_PATH);
const ls = spawn('python', [filepath, id]);
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data.toString());
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data.toString());
});
ls.error.on('error', function (data) {
console.log('error: ' + data.toString());
});
ls.on('exit', function (code) {
console.log('child process exited with code ' + code.toString());
});
ls.on('close', code => {
console.log(`child process exited with code ${code}`);
});
}
}
编辑:Dockerfile
# Pull base image
FROM python:3.7-slim
# Set installation environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV NODE_VERSION=12.20.0
# Install NVM for later use to install Node and NPM
RUN apt-get update && apt install -y curl
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
ENV NVM_DIR=/root/.nvm
RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm use v${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION}
ENV PATH="/root/.nvm/versions/node/v${NODE_VERSION}/bin/:${PATH}"
# Create app directory (with user `node`)
RUN mkdir -p /home/node/app
# Set work directory
WORKDIR /home/node/app
# Install python dependencies
COPY requirements.txt /home/node/app/
RUN pip install -r requirements.txt
RUN pip install swifter
# Install node app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# Bundle app source code
COPY . .
# Build node app
RUN npm run build
# Expose ports
EXPOSE ${DB_PORT}
EXPOSE ${API_PORT}
EXPOSE ${SOCKET_PORT}
CMD [ "node", "." ]
Python第3.7.11版Nodejs v 12.20
Unix由于内存使用率高而终止了Python进程,我能够通过在pod中使用ssh,然后使用dmesg
来终止日志,并使用ps aux --sort -pmem
来查看pod中的内存使用情况,从而在系统日志中找到OOM错误。
OOM的原因是分配给Nodejs的默认内存大大高于正常的2GB限制,这减少了Python的可用内存。减少Nodejs的内存分配或删除多余的Nodejs内存分配解决了这个问题。