2013-03-04 6 views
0

Azure 테이블 저장소로드 테스트에서 내 테스트 앱이 100 %를 사용하는 이유를 알아 내려고하고 있습니다.node.js의 Azure 테이블 저장소의 CPU 사용량이 높습니다.

100 %의 CPU에서 나는 작은 인스턴스에서 약 230 삽입/초를 얻을. 그 번호가 괜찮은지 모르겠지만 그럼에도 내가 CPU 사용량이 너무 높다고 생각합니다.

내 응용 프로그램은 기본적으로 그냥이 수행합니다중인 다른 250 개 삽입이 추가 250 이하가있는 경우

function insert(id) 
{ 
    var task={ PartitionKey: id, RowKey: "1", Description: "bench bench bench" }; 
    pending.inc(); 
    var ts=azure.createTableService(); 
    ts.insertEntity("bench", task, function (err) 
    { 
    pending.dec(); 
    if (err) return console.log("error", err); 
    reqStats.mark(); 
    }); 
} 

을 (이 테스트에 오류가 기록되지 않았다).

나는 --prof와 노드를 실행하지만 출력을 해석하는 방법을 잘 모르겠어요 : 분명히 많은 시간이 exports.Parser.Parser.parseString에 소요되는

Code move event for unknown code: 0x3fe5b8c0 
Statistical profiling result from v8.log, (7703 ticks, 1 unaccounted, 0 excluded). 

[Unknown]: 
    ticks total nonlib name 
     1 0.0% 

[Shared libraries]: 
    ticks total nonlib name 
    4003 52.0% 0.0% D:\Windows\SYSTEM32\ntdll.dll 
    3347 43.5% 0.0% F:\approot\node.exe 
    47 0.6% 0.0% D:\Windows\SYSTEM32\KERNEL32.DLL 
    44 0.6% 0.0% D:\Windows\SYSTEM32\KERNELBASE.dll 
     3 0.0% 0.0% D:\Windows\system32\mswsock.dll 
     1 0.0% 0.0% D:\Windows\SYSTEM32\WS2_32.dll 

[JavaScript]: 
    ticks total nonlib name 
    14 0.2% 5.4% Stub: CEntryStub 
    12 0.2% 4.7% Function: write F:\approot\node_modules\azure\node_modules\xml2js\node_modules\sax\lib\sax.js:883 
    10 0.1% 3.9% Function: EventEmitter.addListener events.js:138 
     7 0.1% 2.7% KeyedLoadIC: A keyed load IC from the snapshot 
     7 0.1% 2.7% Function: ~Request.init F:\approot\node_modules\azure\node_modules\request\main.js:108 
     7 0.1% 2.7% Function: ~ClientRequest http.js:1254 
     6 0.1% 2.3% Stub: StringAddStub 
     5 0.1% 1.9% Stub: RegExpExecStub 
     5 0.1% 1.9% LazyCompile: *urlParse url.js:92 
     5 0.1% 1.9% LazyCompile: *match native string.js:182 
     5 0.1% 1.9% Function: ~XMLFragment.toString F:\approot\node_modules\azure\node_modules\xmlbuilder\lib\XMLFragment.js:287 
     4 0.1% 1.6% LazyCompile: stringify native json.js:307 
     4 0.1% 1.6% LazyCompile: *formatProperty util.js:338 
     4 0.1% 1.6% LazyCompile: *formatPrimitive util.js:289 
     4 0.1% 1.6% LazyCompile: *EventEmitter.emit events.js:54 
     4 0.1% 1.6% Function: ~store http.js:571 
     4 0.1% 1.6% CallMegamorphic: args_count: 1 
     3 0.0% 1.2% Stub: SubStringStub 
     3 0.0% 1.2% LazyCompile: IN native runtime.js:354 
     3 0.0% 1.2% LazyCompile: APPLY_PREPARE native runtime.js:438 
     3 0.0% 1.2% LazyCompile: *GetOwnProperty native v8natives.js:637 
     3 0.0% 1.2% LazyCompile: *FromPropertyDescriptor native v8natives.js:373 
     3 0.0% 1.2% LazyCompile: *Encode native uri.js:179 
     3 0.0% 1.2% LazyCompile: *BuildResultFromMatchInfo native regexp.js:130 
     3 0.0% 1.2% Function: ~StorageServiceClient._buildRequestOptions F:\approot\node_modules\azure\lib\services\core\storageserviceclient.js:192 
     3 0.0% 1.2% Function: ~AtomHandler._writeAtomEntryValue F:\approot\node_modules\azure\lib\util\atomhandler.js:205 
     3 0.0% 1.2% Function: formatValue util.js:189 
     3 0.0% 1.2% CallMegamorphic: args_count: 3 
     3 0.0% 1.2% Builtin: A builtin from the snapshot {2} 
     2 0.0% 0.8% Stub: KeyedStoreElementStub {1} 
     2 0.0% 0.8% Stub: FastNewClosureStub 
     2 0.0% 0.8% Stub: CompareStub 
     2 0.0% 0.8% RegExp: ^"([a-zA-Z_][a-zA-Z_0-9]*)"$ 
     2 0.0% 0.8% RegExp: Content-Length 
     2 0.0% 0.8% LazyCompile: join native array.js:410 
     2 0.0% 0.8% LazyCompile: ToString native runtime.js:550 
     2 0.0% 0.8% LazyCompile: ConvertToString native array.js:195 
     2 0.0% 0.8% LazyCompile: *toLowerCase native string.js:739 
     2 0.0% 0.8% LazyCompile: *socketOnData http.js:1480 
     2 0.0% 0.8% LazyCompile: *slice native string.js:510 
     2 0.0% 0.8% LazyCompile: *indexOf native string.js:118 
     2 0.0% 0.8% LazyCompile: *exports.stringStartsWith F:\approot\node_modules\azure\lib\util\util.js:131 
     2 0.0% 0.8% LazyCompile: *XMLFragment F:\approot\node_modules\azure\node_modules\xmlbuilder\lib\XMLFragment.js:8 
     2 0.0% 0.8% LazyCompile: *IsDataDescriptor native v8natives.js:354 
     2 0.0% 0.8% LazyCompile: *EventEmitter events.js:25 
     2 0.0% 0.8% Function: ~XMLFragment.element F:\approot\node_modules\azure\node_modules\xmlbuilder\lib\XMLFragment.js:18 
     2 0.0% 0.8% Function: ~Request.init F:\approot\node_modules\azure\node_modules\request\main.js:362 
     2 0.0% 0.8% Function: ~OutgoingMessage.end http.js:794 
     2 0.0% 0.8% Function: ~Logger.log F:\approot\node_modules\azure\lib\diagnostics\logger.js:68 
     2 0.0% 0.8% Builtin: A builtin from the snapshot {3} 
     2 0.0% 0.8% Builtin: A builtin from the snapshot {1} 
     1 0.0% 0.4% Stub: ToBooleanStub_String 
     1 0.0% 0.4% Stub: ToBooleanStub 
     1 0.0% 0.4% Stub: StoreArrayLiteralElementStub 
     1 0.0% 0.4% Stub: RecordWriteStub {1} 
     1 0.0% 0.4% Stub: RecordWriteStub 
     1 0.0% 0.4% Stub: NumberToStringStub 
     1 0.0% 0.4% Stub: KeyedStoreElementStub 
     1 0.0% 0.4% Stub: JSEntryStub 
     1 0.0% 0.4% Stub: InstanceofStub 
     1 0.0% 0.4% Stub: CallFunctionStub_Args0 
     1 0.0% 0.4% Stub: CallConstructStub_Recording 
     1 0.0% 0.4% Stub: CallConstructStub 
     1 0.0% 0.4% Stub: BinaryOpStub_ADD_OverwriteRight_BothStrings 
     1 0.0% 0.4% Stub: BinaryOpStub_ADD_OverwriteLeft_SMI 
     1 0.0% 0.4% Stub: BinaryOpStub_ADD_OverwriteLeft_BothStrings 
     1 0.0% 0.4% RegExp: [^A-Za-z0-9_-] 
     1 0.0% 0.4% RegExp: Date 
     1 0.0% 0.4% RegExp: (^"|"$) 
     1 0.0% 0.4% LazyCompile: toString native v8natives.js:223 
     1 0.0% 0.4% LazyCompile: Join native array.js:119 
     1 0.0% 0.4% LazyCompile: FILTER_KEY native runtime.js:398 
     1 0.0% 0.4% LazyCompile: *test native regexp.js:220 
     1 0.0% 0.4% LazyCompile: *startup.processNextTick.process.nextTick node.js:254 
     1 0.0% 0.4% LazyCompile: *startup.processNextTick.process._tickCallback node.js:233 
     1 0.0% 0.4% LazyCompile: *split native string.js:554 
     1 0.0% 0.4% LazyCompile: *replace native string.js:221 
     1 0.0% 0.4% LazyCompile: *onread net.js:377 
     1 0.0% 0.4% LazyCompile: *map native array.js:1190 
     1 0.0% 0.4% LazyCompile: *isRegExp util.js:427 
     1 0.0% 0.4% LazyCompile: *isArray native array.js:1463 
     1 0.0% 0.4% LazyCompile: *indexOf native array.js:1236 
     1 0.0% 0.4% LazyCompile: *freeParser http.js:1385 
     1 0.0% 0.4% LazyCompile: *forEach native array.js:1062 
     1 0.0% 0.4% LazyCompile: *copy F:\approot\node_modules\azure\node_modules\request\main.js:72 
     1 0.0% 0.4% LazyCompile: *afterConnect net.js:719 
     1 0.0% 0.4% LazyCompile: *insert F:\approot\server.js:1949 
     1 0.0% 0.4% LazyCompile: *UseSparseVariant native array.js:111 
     1 0.0% 0.4% LazyCompile: *TwoDigitString native date.js:213 
     1 0.0% 0.4% LazyCompile: *TableService.insertEntity F:\approot\node_modules\azure\lib\services\table\tableservice.js:500 
     1 0.0% 0.4% LazyCompile: *StringSplitOnRegExp native string.js:591 
     1 0.0% 0.4% LazyCompile: *Socket._write net.js:515 
     1 0.0% 0.4% LazyCompile: *Socket net.js:131 
     1 0.0% 0.4% LazyCompile: *ServiceClient.performRequest F:\approot\node_modules\azure\lib\services\core\serviceclient.js:161 
     1 0.0% 0.4% LazyCompile: *Request.end F:\approot\node_modules\azure\node_modules\request\main.js:952 
     1 0.0% 0.4% LazyCompile: *PropertyDescriptor native v8natives.js:482 
     1 0.0% 0.4% LazyCompile: *OutgoingMessage.write http.js:731 
     1 0.0% 0.4% LazyCompile: *CookieJar.get F:\approot\node_modules\azure\node_modules\request\vendor\cookie\jar.js:46 
     1 0.0% 0.4% LazyCompile: *AtomHandler._convertToAtomPropertyText F:\approot\node_modules\azure\lib\util\atomhandler.js:279 
     1 0.0% 0.4% LazyCompile: *Agent.addRequest http.js:1170 
     1 0.0% 0.4% LazyCompile: *$Array.configurable_ native v8natives.js:540 
     1 0.0% 0.4% Function: ~onanswer dns.js:116 
     1 0.0% 0.4% Function: ~forEach F:\approot\node_modules\lodash\dist\lodash.js:2325 
     1 0.0% 0.4% Function: ~exports.Parser.Parser.reset.saxParser.onopentag F:\approot\node_modules\azure\node_modules\xml2js\lib\xml2js.js:108 
     1 0.0% 0.4% Function: ~exports.Parser.Parser.reset.saxParser.onclosetag F:\approot\node_modules\azure\node_modules\xml2js\lib\xml2js.js:135 
     1 0.0% 0.4% Function: ~asyncCallback dns.js:65 
     1 0.0% 0.4% Function: ~WebResource.getQueryStringValues F:\approot\node_modules\azure\lib\http\webresource.js:204 
     1 0.0% 0.4% Function: ~WebResource.getQueryString F:\approot\node_modules\azure\lib\http\webresource.js:223 
     1 0.0% 0.4% Function: ~Socket.connect net.js:687 
     1 0.0% 0.4% Function: ~Socket.connect net.js:651 
     1 0.0% 0.4% Function: ~ServiceClient._performRequest.self._buildRequestOptions.requestStream.end F:\approot\node_modules\azure\lib\services\core\serviceclient.js:239 
     1 0.0% 0.4% Function: ~ServiceClient._performRequest.self._buildRequestOptions.operation F:\approot\node_modules\azure\lib\services\core\serviceclient.js:216 
     1 0.0% 0.4% Function: ~Request.write F:\approot\node_modules\azure\node_modules\request\main.js:948 
     1 0.0% 0.4% Function: ~Request.start.self.req.self.httpModule.request.response.on.self._ended F:\approot\node_modules\azure\node_modules\request\main.js:617 
     1 0.0% 0.4% Function: ~Request F:\approot\node_modules\azure\node_modules\request\main.js:84 
     1 0.0% 0.4% Function: ~EventEmitter.addListener events.js:138 
     1 0.0% 0.4% Function: ~AtomHandler.serialize F:\approot\node_modules\azure\lib\util\atomhandler.js:174 
     1 0.0% 0.4% CallNormal: args_count: 0 
     1 0.0% 0.4% CallMegamorphic: args_count: 2 
     1 0.0% 0.4% Builtin: A builtin from the snapshot {5} 
     1 0.0% 0.4% Builtin: A builtin from the snapshot {4} 
     1 0.0% 0.4% Builtin: A builtin from the snapshot 

[C++]: 
    ticks total nonlib name 

[GC]: 
    ticks total nonlib name 
    268 3.5% 

[Bottom up (heavy) profile]: 
    Note: percentage shows a share of a particular caller in the total 
    amount of its parent calls. 
    Callers occupying less than 2.0% are not shown. 

    ticks parent name 
    4003 52.0% D:\Windows\SYSTEM32\ntdll.dll 
    97 2.4% LazyCompile: *connect net.js:614 
    97 100.0%  Function: ~Socket.connect net.js:687 
    97 100.0%  Function: ~asyncCallback dns.js:65 
    97 100.0%   Function: ~onanswer dns.js:116 

    3347 43.5% F:\approot\node.exe 
    533 15.9% Function: exports.Parser.Parser.parseString F:\approot\node_modules\azure\node_modules\xml2js\lib\xml2js.js:205 
    533 100.0%  Function: ~__bind F:\approot\node_modules\azure\node_modules\xml2js\lib\xml2js.js:6 
    533 100.0%  Function: ServiceClient._parseResponse F:\approot\node_modules\azure\lib\services\core\serviceclient.js:499 
    516 96.8%   LazyCompile: *ServiceClient._processResponse F:\approot\node_modules\azure\lib\services\core\serviceclient.js:307 
    516 100.0%   Function: ~ServiceClient._performRequest.self._buildRequestOptions.processResponseCallback F:\approot\node_modules\azure\lib\services\core\serviceclient.js:219 
    17 3.2%   Function: ~ServiceClient._processResponse F:\approot\node_modules\azure\lib\services\core\serviceclient.js:307 
    17 100.0%   Function: ~ServiceClient._performRequest.self._buildRequestOptions.processResponseCallback F:\approot\node_modules\azure\lib\services\core\serviceclient.js:219 
    258 7.7% LazyCompile: *socketOnData http.js:1480 
    172 66.7%  LazyCompile: *onread net.js:377 
     7 2.7%  Function: ~onread net.js:377 
    196 5.9% LazyCompile: *is F:\approot\node_modules\azure\node_modules\xml2js\node_modules\sax\lib\sax.js:275 
    196 100.0%  Function: write F:\approot\node_modules\azure\node_modules\xml2js\node_modules\sax\lib\sax.js:883 
    196 100.0%  Function: exports.Parser.Parser.parseString F:\approot\node_modules\azure\node_modules\xml2js\lib\xml2js.js:205 
    196 100.0%   Function: ~__bind F:\approot\node_modules\azure\node_modules\xml2js\lib\xml2js.js:6 
    196 100.0%   Function: ServiceClient._parseResponse F:\approot\node_modules\azure\lib\services\core\serviceclient.js:499 
    161 4.8% Function: write F:\approot\node_modules\azure\node_modules\xml2js\node_modules\sax\lib\sax.js:883 
    161 100.0%  Function: exports.Parser.Parser.parseString F:\approot\node_modules\azure\node_modules\xml2js\lib\xml2js.js:205 
    161 100.0%  Function: ~__bind F:\approot\node_modules\azure\node_modules\xml2js\lib\xml2js.js:6 
    161 100.0%   Function: ServiceClient._parseResponse F:\approot\node_modules\azure\lib\services\core\serviceclient.js:499 
    156 96.9%   LazyCompile: *ServiceClient._processResponse F:\approot\node_modules\azure\lib\services\core\serviceclient.js:307 
     5 3.1%   Function: ~ServiceClient._processResponse F:\approot\node_modules\azure\lib\services\core\serviceclient.js:307 
    90 2.7% Function: ~ClientRequest.onSocket http.js:1617 
    86 95.6%  LazyCompile: *startup.processNextTick.process._tickCallback node.js:233 
     4 4.4%  Function: ~startup.processNextTick.process._tickCallback node.js:233 
    85 2.5% LazyCompile: *EventEmitter.emit events.js:54 
    29 34.1%  Function: <anonymous> F:\approot\node_modules\azure\node_modules\request\main.js:636 
    29 100.0%  LazyCompile: *EventEmitter.emit events.js:54 
    29 100.0%   Function: ~Request.start.self.req.self.httpModule.request.buffer F:\approot\node_modules\azure\node_modules\request\main.js:621 
    29 100.0%   LazyCompile: *EventEmitter.emit events.js:54 
    23 27.1%  Function: ~Socket._destroy.destroyed net.js:357 
    23 100.0%  LazyCompile: *startup.processNextTick.process._tickCallback node.js:233 
    17 20.0%  Function: EventEmitter.addListener events.js:138 
     7 41.2%  Function: ~<anonymous> F:\approot\node_modules\azure\node_modules\request\main.js:519 
     7 100.0%   Function: ~g events.js:190 
     7 100.0%   LazyCompile: *EventEmitter.emit events.js:54 
     5 29.4%  Function: ~Request.start F:\approot\node_modules\azure\node_modules\request\main.js:503 
     5 100.0%   Function: ~Request.write F:\approot\node_modules\azure\node_modules\request\main.js:948 
     5 100.0%   Function: ~Request.init F:\approot\node_modules\azure\node_modules\request\main.js:362 
     2 11.8%  LazyCompile: *Agent.createSocket http.js:1189 
     2 100.0%   LazyCompile: *Agent.addRequest http.js:1170 
     2 100.0%   Function: ~ClientRequest http.js:1254 
     1 5.9%  LazyCompile: *parserOnIncomingClient http.js:1531 
     1 100.0%   LazyCompile: *socketOnData http.js:1480 
     1 5.9%  LazyCompile: *EventEmitter.once events.js:184 
     1 100.0%   Function: ~<anonymous> F:\approot\node_modules\azure\node_modules\request\main.js:519 
     1 100.0%   Function: ~g events.js:190 
     1 5.9%  Function: ~Request.init F:\approot\node_modules\azure\node_modules\request\main.js:108 
     1 100.0%   Function: ~Request F:\approot\node_modules\azure\node_modules\request\main.js:84 
     1 100.0%   LazyCompile: *request F:\approot\node_modules\azure\node_modules\request\main.js:983 
     4 4.7%  LazyCompile: *parserOnMessageComplete http.js:127 
     4 100.0%  LazyCompile: *socketOnData http.js:1480 
     3 75.0%   LazyCompile: *onread net.js:377 
     3 3.5%  LazyCompile: *responseOnEnd http.js:1591 
     3 100.0%  LazyCompile: *EventEmitter.emit events.js:54 
     2 66.7%   LazyCompile: *IncomingMessage._emitEnd http.js:364 
     2 100.0%   Function: ~parserOnMessageComplete http.js:127 
     1 33.3%   LazyCompile: *parserOnMessageComplete http.js:127 
     1 100.0%   LazyCompile: *socketOnData http.js:1480 
     2 2.4%  Function: ~Request.start.self.req.self.httpModule.request.buffer F:\approot\node_modules\azure\node_modules\request\main.js:621 
     2 100.0%  LazyCompile: *EventEmitter.emit events.js:54 
     1 50.0%   Function: ~parserOnMessageComplete http.js:127 
     1 100.0%   LazyCompile: *socketOnData http.js:1480 
     1 50.0%   Function: ~IncomingMessage._emitEnd http.js:364 
     1 100.0%   Function: ~parserOnMessageComplete http.js:127 
     2 2.4%  Function: ~Agent.createSocket.onFree http.js:1209 
     2 100.0%  LazyCompile: *EventEmitter.emit events.js:54 
     2 100.0%   LazyCompile: *responseOnEnd http.js:1591 
     2 100.0%   LazyCompile: *EventEmitter.emit events.js:54 
    74 2.2% LazyCompile: *replace native string.js:221 
    44 59.5%  LazyCompile: *formatPrimitive util.js:289 
    29 65.9%  LazyCompile: *formatValue util.js:189 
    29 100.0%   LazyCompile: *formatProperty util.js:338 
    29 100.0%   Function: <anonymous> util.js:278 
    15 34.1%  Function: formatValue util.js:189 
    15 100.0%   LazyCompile: *formatProperty util.js:338 
    15 100.0%   Function: <anonymous> util.js:278 
    26 35.1%  LazyCompile: *formatProperty util.js:338 
    26 100.0%  Function: <anonymous> util.js:278 
    26 100.0%   LazyCompile: *map native array.js:1190 
    16 61.5%   LazyCompile: *formatValue util.js:189 
    10 38.5%   Function: formatValue util.js:189 
     3 4.1%  LazyCompile: *Agent.createSocket http.js:1189 
     3 100.0%  LazyCompile: *Agent.addRequest http.js:1170 
     3 100.0%   Function: ~ClientRequest http.js:1254 
     3 100.0%   Function: ~exports.request http.js:1718 

(? 오른쪽) - 하지만 왜 그 함수는 상향식 테이블에만 나열됩니까?

왜 ntdll에서 시간을 보냈습니까? 이 Node.js를 자체 또는 함께, 푸른-SDK-에 대한 노드에 문제가

가 내 기대가 너무 높다?

+0

귀하의 예를 생각해 볼 때, 나는 최선의 CPU를 좋은 것으로 생각할 것입니다. 분명히 구문 분석은 테스트에서 대부분 힘든 일이 될 것입니다. 더 큰 기계를 사용하여 어떤 일이 일어 났는지 보았습니까? –

+0

아니요, 현재 구독료가 최고입니다. 나는 .Net 작업자를 테스트했는데 (또한 삽입 만) xs 인스턴스에서 최대 대역폭과 함께 50 % cpu로 500 초/초를 수행 할 수있었습니다. – laktak

+0

기본적으로 순수 CPU 처리량 테스트입니다. 한쪽에는 Windows에서 * ".NET"*, 다른쪽에는 "Windows에서 Node.js 0.8"*이 있습니다. .NET이 그 싸움에서 이기게 될 것이 분명합니다. 사실 Azure for Node에는 성능 문제가있을 수 있습니다. 실제로, 모든 파트 (Azure, Node, AzureForNode)의 상대적인 미숙을 감안할 때, 최적화되지 않은 것들이 거의 확실합니다.얼리 어답터로서,이 물건에 대한 최선의 방법은이 물건을 만드는 MS에있는 사람들에게 이야기하는 것입니다. 나는 그들의 github 계정으로 시작할 것입니다. –

답변

0

여기에서 기본 답변을 작성하겠습니다. 모든 CPU 작업이 JSON로/XML을 직렬화에서 네트워크 수준 &에서처럼

는 것 같습니다. 의견에서 당신은 .NET에서 2-4 배 성능을 향상시키는 것에 대해 언급합니다. 이 Node.js를 자체 또는 함께, 푸른-SDK-에 대한 노드에 문제가

가 내 기대가 너무 높다?

나는 두 부분에 대한 대답은 '예라고 생각합니다. 뭔가 순수하게 CPU 바인딩에서

는 Windows에서 .NET은 Windows에서 Node.js를 이길 것입니다. 여기선 실제 컨테스트가 아닙니다. 언급

, 그것은 모두 azure-sdk-for-node과 Node.js를 자체 내에서 일부 성능 병목 현상이 있음도 꽤 가능성이 있습니다. 이 자료의 대부분은 1 년 미만 동안 있었고 node.js는 주로 Windows 용이 아닌 &으로 조정되었습니다.

리눅스 박스 (에서 Azure에서 호스트 할 수 있음)를 테스트하여 성능이 향상되는지 확인하는 것이 좋습니다. 또한 Node를 처리하는 team @ MS와 자신의 물건을 공유하는 것이 좋습니다.

+0

Linux에서도 테스트했음을 잊어 버렸지 만 성능은 기본적으로 동일합니다. – laktak

관련 문제