2017-11-19 21 views
0

소비 계획에 azure 대기열 기능을 실행 중입니다. 내 함수는 FFMpeg 프로세스를 시작하므로 매우 CPU를 많이 사용합니다. 대기열에 100 개 미만의 항목이있는 기능을 실행하면 완벽하게 작동합니다. 하늘색은 확장되어 많은 서버를 제공하며 모든 작업이 매우 빠르게 완료됩니다. 한 번에 300 개 또는 400 개의 항목을 처리하기 시작하면 문제가 발생하지만 CPU는 80 %의 사용률에서 약 10 %의 사용률로 천천히 이동합니다. 즉, 10 %의 CPU만으로도 기능이 끝나지 않습니다. 이것은 아래 그림에서 볼 수 있습니다. 누가 CPU 사용률이 더 낮아지면 내 함수가 더 많은 인스턴스를 생성하는지 알 수 있습니까? 미리 감사드립니다 Cuanffmpeg azure 기능 소비 계획 높은 볼륨 요청에 대한 CPU 사용률이 낮음

편집 : 함수 만 인스턴스 당 한 번에 하나씩 실행으로 설정하지만, host.json

편집에 인스턴스 당 2 ~ 3 동시 프로세스로 설정하면 문제가있는 경우 : CPU 방울이 15-20 개 서버에서 눈에 띄게 나타나 약 60시에 오류가 발생하기 시작합니다. 그 후 CPU는 개인이 0-3 %에 도달하면서 평균 8-10 %로 떨어지고 서버 수는 제한없이 증가합니다 서버가있는 CPU가 있으면 더 도움이 될 것입니다.)

다시 한번 감사드립니다.

도움이 될 수 있도록 기능 코드를이 게시물 하단에 추가했습니다.

live metrics cpu

CPU useageg

using System.Net; 
using System; 
using System.Diagnostics; 
using System.ComponentModel; 

public static void Run(string myQueueItem, TraceWriter log) 
{ 
    log.Info($"C# Queue trigger function processed a request: {myQueueItem}"); 
    //Basic Parameters 
     string ffmpegFile = @"D:\home\site\wwwroot\CommonResources\ffmpeg.exe"; 
     string outputpath = @"D:\home\site\wwwroot\queue-ffmpeg-test\output\"; 
     string reloutputpath = "output/"; 
     string relinputpath = "input/"; 
     string outputfile = "video2.mp4"; 
     string dir = @"D:\home\site\wwwroot\queue-ffmpeg-test\"; 

    //Special Parameters 

     string videoFile = "1 minute basic.mp4"; 
     string sub = "1 minute sub.ass"; 
    //guid tmp files 

     // Guid g1=Guid.NewGuid(); 
     // Guid g2=Guid.NewGuid(); 
     // string f1 = g1 + ".mp4"; 
     // string f2 = g2 + ".ass"; 
     string f1 = videoFile; 
     string f2 = sub; 
    //guid output - we will now do this at the caller level 
     string g3 = myQueueItem; 
     string outputGuid = g3+".mp4"; 
    //get input files 
    //argument 
     string tmp = subArg(f1, f2, outputGuid); 
    //String.Format("-i \"" + @"input/tmp.mp4" + "\" -vf \"ass = '" + sub + "'\" \"" + reloutputpath +outputfile + "\" -y"); 
    log.Info("ffmpeg argument is: "+tmp); 


    //startprocess parameters 
    Process process = new Process(); 
    process.StartInfo.FileName = ffmpegFile; 
    process.StartInfo.Arguments = tmp; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.RedirectStandardError = true; 
    process.StartInfo.WorkingDirectory = dir; 
    //output handler 

    process.OutputDataReceived += new DataReceivedEventHandler(
     (s, e) => 
     { 
      log.Info("O: "+e.Data); 
     } 
    ); 
    process.ErrorDataReceived += new DataReceivedEventHandler(
     (s, e) => 
     { 
      log.Info("E: "+e.Data); 
     } 
    ); 
    //start process 
    process.Start(); 
    log.Info("process started"); 
    process.BeginOutputReadLine(); 
    process.BeginErrorReadLine(); 
    process.WaitForExit(); 
} 
public static void getFile(string link, string fileName, string dir, string relInputPath){ 
    using (var client = new WebClient()){ 
     client.DownloadFile(link, dir + relInputPath+ fileName); 
     } 

} 
public static string subArg(string input1, string input2, string output1){ 
    return String.Format("-i \"" + @"input/" +input1+ "\" -vf \"ass = '" + @"input/"+input2 + "'\" \"" + @"output/" +output1 + "\" -y"); 

} 

답변

0

당신은 D 사용하는 경우 : 홈 디렉토리 \ 각 인스턴스가 계속 같은 자리에 작성하려고하는 의미 가상 함수에 작성을 대규모 I/O 블록을 발생시키는 기능이 실행됩니다. 대신 D : \ local에 작성한 다음 완성 된 파일을 다른 곳으로 보내는 것은 각 인스턴스가 완료 될 때만 작성하는 위치에 지속적으로 쓰는 대신 이러한 방식으로 문제를 해결하고 높은 처리량을 처리하도록 설계된 위치에 작성합니다.

D : \ local에 쓰고 난 후 입력과 출력을 관리하는 가장 쉬운 방법은 하늘 저장소로 함수를 연결하고 그 방법으로 처리하는 것입니다. 이렇게함으로써 동시 인스턴스 70 개 이상에 대해 평균 CPU 사용량을 90-100 %로 유지합니다.