Verbeteringen in profilering in Go 1.18 · Felix Geisendörfer

Verbeteringen in profilering in Go 1.18 · Felix Geisendörfer


Verbeteringen in profilering in Go 1.18 · Felix Geisendörfer

Gepubliceerd:

Zonder twijfel zal Go 1.18 een van de meest opwindende releases worden sinds Go 1. Je hebt waarschijnlijk gehoord van belangrijke functies zoals generieke geneesmiddelen en fuzzing, maar daar gaat dit bericht niet over. In plaats daarvan zullen we het hebben over profilering en enkele opmerkelijke verbeteringen benadrukken waar we naar uit kunnen kijken.

Een punt van persoonlijke vreugde voor mij is dat ik heb kunnen bijdragen aan verschillende verbeteringen als onderdeel van mijn werk bij Datadog en dat deze onze nieuwe Connecting Go Profiling With Tracing-functionaliteit aanzienlijk zullen verbeteren.

Als u nog niet bekend bent met Go-profilering, kunt u ook onze Gids voor Go-profilering lezen voordat u in dit bericht duikt.

Betere CPU-profileringsnauwkeurigheid

Laten we beginnen met de belangrijkste profileringswijziging in Go 1.18: de CPU-profiler voor Linux is een stuk nauwkeuriger geworden. Vooral CPU-bursts op multi-coresystemen werden vroeger onderschat, maar dat is nu opgelost.

Deze wijziging gaat terug tot eind 2019 (go1.13) toen Rhys Hiltner GH 35057 opende om te melden dat hij een Go-service zag die gebruik maakte van 20 CPU-kernen volgens topmaar alleen 2.4 kernen volgens de CPU-profiler van Go. Toen hij dieper graafde, ontdekte Rhys dat dit probleem werd veroorzaakt door het wegvallen van POSIX-signalen in de kernel.

Om het probleem te begrijpen, is het de moeite waard om te weten dat de CPU-profiler van Go 1.17 bovenop de setitimer(2) syscall is gebouwd. Hierdoor kan de Go-runtime de Linux-kernel vragen om voor elke melding een melding te ontvangen 10ms het programma draait op een CPU. Deze meldingen worden afgeleverd als SIGPROF signalen. Elke levering van een signaal zorgt ervoor dat de kernel het programma stopt en de signaalhandlerroutine van de runtime aanroept op een van de gestopte threads. De signaalhandler neemt een stacktracering van de huidige goroutine en voegt deze toe aan het CPU-profiel. Dit alles kost minder dan ~10usec waarna de kernel de uitvoering van het programma hervat.

Dus wat was er mis? Nou, gezien de programmarapportage van Rhys 20 CPU-kernen die worden gebruikt door topzou de verwachte signaalsnelheid moeten zijn 2,000 per seconde. Het resulterende profiel bevatte echter slechts een gemiddelde van 240 stapelt sporen per seconde. Uit verder onderzoek met behulp van Linux Event Tracing bleek dat de verwachte hoeveelheid signal:signal_generate Er werden gebeurtenissen waargenomen, maar niet genoeg signal:signal_deliver evenementen. Het verschil tussen het genereren en afleveren van signalen lijkt in eerste instantie misschien verwarrend, maar is te wijten aan het feit dat standaard POSIX-signalen niet in de wachtrij staan, zie signal(7). Er kan slechts één signaal tegelijk in afwachting zijn van bezorging. Als een ander signaal van dezelfde soort wordt gegenereerd terwijl er al een signaal in behandeling is, wordt het nieuwe signaal verwijderd.

Dit verklaart echter nog steeds niet waarom er tijdens precies hetzelfde zoveel signalen zouden worden gegenereerd < ~10usec signaalafhandelingsvenster zodat ze boven op elkaar terecht zouden komen. Het volgende stukje van deze puzzel is dus het feit dat de resolutie van systeemaanroepen die de CPU-tijd meten, beperkt zijn tot de softwareklok van de kernel, die de tijd meet in jiffieszie tijd(7). De duur van een handomdraai hangt af van de kernelconfiguratie, maar is standaard 4ms (250Hz). Wat dit betekent is dat de kernel niet eens in staat is om de wens van Go te honoreren om elke keer een signaal te ontvangen 10ms. In plaats daarvan moet er worden afgewisseld 8ms En 12ms zoals te zien is in het onderstaande histogram (details).

Sinds afwisselend 8ms En 12ms lukt nog steeds 10ms gemiddeld genomen is het op zichzelf geen probleem. Wat echter een probleem is, is wat er gebeurt als bijv 10 threads draaien op verschillende CPU-kernen, waardoor ze worden gebruikt 40ms van CPU-tijd binnen een 4ms even raam. Dus wanneer de kernel zijn controles uitvoert, moet hij genereren 4 SIGPROF signalen tegelijk, waardoor ze op één na allemaal worden weggelaten in plaats van afgeleverd. Of met andere woorden, setitimer(2) – de draagbare API van de kernel die wordt geadverteerd voor profilering – blijkt ongeschikt te zijn voor het profileren van drukke multi-core systemen :(.

Echter, gezien het feit dat de man-pagina’s de korte beperkingen van CPU-tijdgerelateerde syscalls en de semantiek van procesgestuurde signalen uitleggen, is het niet helemaal duidelijk of dit door de kernelbeheerders als een bug zou worden herkend. Maar zelfs als setitimer(2) opgelost zou zijn, zou het lang duren voordat mensen hun kernels zouden upgraden, dus bracht Rhys het idee van gebruik naar voren timer_create(2) die boekhouding per thread van in behandeling zijnde signalen biedt.

Helaas kreeg het idee geen feedback van de Go-beheerders, dus het probleem bleef sluimeren totdat Rhys en ik er in mei 2021 opnieuw over begonnen te praten. op twitter. We besloten samen te werken, waarbij Rhys werkte aan de kritieke wijzigingen in de CPU-profiler, en ik aan een betere testdekking voor cgo en andere randgevallen, weergegeven in het onderstaande diagram.

Een andere bijzaak van mij was het creëren van een zelfstandig C-programma genaamd proftest om het signaalgeneratie- en leveringsgedrag van te observeren setitimer(2) En timer_create(2) wat een ander bias-probleem uit 2016 bevestigde: setitimer(2)De procesgerichte signalen zijn niet eerlijk verdeeld over CPU-consumerende threads. In plaats van één draad heeft de neiging om vastgeschroefd te raken en ontvangt minder signalen dan alle andere threads. Nu, om eerlijk te zijn, signal(7) stelt dat de kernel een willekeurige thread kiest waaraan procesgerichte signalen moeten worden afgegeven wanneer meerdere threads in aanmerking komen. Maar aan de andere kant vertoont macOS dit soort vooroordelen niet, en ik denk dat dit het punt is waarop ik moet stoppen met het maken van excuses namens de Linux-kernel :).

Maar het goede nieuws is dat, afgezien van de snelle resolutie, timer_create(2) lijkt niet te lijden aan een van de kwalen waar hij last van heeft setitimer(2). Dankzij signaalaccounting per thread levert het op betrouwbare wijze de juiste hoeveelheid signalen en vertoont het geen voorkeur voor bepaalde threads. Het enige probleem is dat timer_create(2) vereist dat de CPU-profiler op de hoogte is van alle threads. Dit is gemakkelijk voor threads die zijn gemaakt door de Go-runtime, maar wordt lastig wanneer cgo-code zijn eigen threads voortbrengt. Rhys-patch lost dit op door te combineren timer_create(2) En setitimer(2). Wanneer een signaal wordt ontvangen, controleert de signaalbehandelaar de oorsprong van het signaal en verwijdert dit als dit niet de beste signaalbron is die beschikbaar is voor de huidige thread. Bovendien heeft de patch ook een aantal slimme stukjes om vooringenomenheid tegen kortstondige threads te vermijden en is hij in het algemeen gewoon een geweldig stukje techniek.

Hoe dan ook, dankzij veel beoordelingen en feedback van de Go-beheerders is de Rhys-patch samengevoegd en geleverd met Go 1.18, waarmee GH 35057 en GH 14434 zijn hersteld. Mijn testcases hebben het niet gehaald, deels omdat het moeilijk is om niet-vliegende beweringen te doen over profileringsgegevens, maar vooral omdat we niet het risico wilden lopen dat die patches de aandacht van upstream zouden afleiden van de belangrijkste veranderingen zelf. Niettemin was deze open source community-samenwerking een van mijn favoriete computerervaringen van 2021!

Bugfixes voor Profiler-labels

Met Profiler-labels (ook wel pprof-labels of -tags genoemd) kunnen gebruikers willekeurige sleutel/waarde-paren associëren met de momenteel actieve goroutine, die worden overgenomen door onderliggende goroutines. Deze labels komen ook terecht in CPU- en Goroutine-profielen, waardoor deze profielen kunnen worden opgedeeld op basis van labelwaarden.

Bij Datadog gebruiken we profilerlabels voor Connecting Go Profiling With Tracing en als onderdeel van het werken aan deze functie heb ik er veel op getest. Dit zorgde ervoor dat ik stapelsporen in mijn profielen waarnam waaraan labels moesten zijn bevestigd, maar dat was niet het geval. Ik ging verder door het probleem te melden als GH 48577 en de oorzaak nader te onderzoeken.

Gelukkig bleek het probleem heel simpel. De CPU-profiler keek soms naar de verkeerde goroutine bij het toevoegen van het label en vereiste in wezen slechts een oplossing van één regel:

-cpuprof.add(gp, stk(:n))
+cpuprof.add(gp.m.curg, stk(:n))

Dit kan in het begin een beetje verwarrend zijn gp is de huidige goroutine en wijst meestal naar dezelfde plaats als gp.m.curg (de huidige goroutine van de draad gp loopt door). Deze twee zijn echter niet hetzelfde wanneer Go van stapel moet wisselen (bijvoorbeeld tijdens het verwerken van signalen of het wijzigen van de grootte van de stapel van de huidige goroutine), dus als het signaal op een ongelukkig moment arriveert, gp verwijst naar een puur interne goroutine die namens de gebruiker wordt uitgevoerd, maar waarbij de labels ontbreken die bij de huidige stacktracering horen stk. Blijkbaar is dit een veel voorkomend probleem, dus het is zelfs gedocumenteerd in de runtime/HACKING.md-handleiding.

Gezien de eenvoud van het probleem heb ik er een patch van één regel voor ingediend. De patch werd echter begroet met het klassieke OSS-antwoord: “Kun je er alsjeblieft een test voor schrijven?” – geleverd door Michael Pratt. Ik twijfelde aanvankelijk aan de ROI van zo’n testcase, maar ik had het niet méér mis kunnen hebben. Het was absoluut heel moeilijk om een ​​niet-flaky test te schrijven om het probleem aan te tonen, en daarom moest de oorspronkelijke versie van de patch worden teruggedraaid. Het proces van het implementeren en verbeteren van de testcase hielp Michael echter om twee extra problemen met betrekking tot labels te identificeren, die hij uiteindelijk allebei oploste:

CL 369741 heeft een fout opgelost die één-voor-één optrad bij het coderen van de eerste batch pprof-monsters, waardoor een klein aantal monsters werd getagd met de verkeerde labels.

CL 369983 heeft een probleem opgelost waardoor systeemgoroutines (bijvoorbeeld voor GC) labels overnamen wanneer ze voortkwamen uit gebruikersgoroutines.

Omdat alle drie de problemen zijn opgelost, worden profilerlabels een stuk nauwkeuriger in Go 1.18. De grootste impact zal zijn voor programma’s die veel cgo gebruiken, aangezien C-aanroepen op een aparte stapel draaien gp != gp.m.curg. Maar zelfs reguliere programma’s ervaren 3-4% ontbrekende labels in Go 1.17 zullen profiteren van deze verandering en volledige nauwkeurigheid bereiken.

Bugfix voor Stack Trace

Een andere profileringsgerelateerde bug die we bij Datadog hebben ontdekt, is GH 49171. Het probleem manifesteerde zich in delta-allocatieprofielen met negatieve allocatietellingen. Toen we dieper gingen graven, kwamen we niet-deterministische programmateller-symbolisatie (pc) tegen als hoofdoorzaak. Wat dit betekent is dat exact dezelfde stacktracering (dezelfde programmatellers) verschillende symbolen (bijvoorbeeld bestandsnamen) zou bevatten in profielen die op een ander tijdstip zijn gemaakt, wat onmogelijk zou moeten zijn.

De bug was ook heel moeilijk zelfstandig te reproduceren, en het kostte me bijna een week voordat het lukte en het upstream rapporteerde. Uiteindelijk bleek het een compiler-regressie te zijn met inline sluitingen in Go 1.17, die werd opgelost door Than McIntosh.

Epiloog

Zoals u kunt zien, bevat Go 1.18 niet alleen boordevol opwindende nieuwe functies, maar ook een aantal belangrijke verbeteringen in de profilering. Laat het me weten als ik iets heb gemist of als je vragen of feedback hebt.

Bedankt voor het lezen en dank aan mijn collega Nick Ripley voor het beoordelen van dit bericht.

— Felix Geisendörfer


Abonneer u op deze blog via RSS of e-mail of ontvang kleine updates van mij via Twitteren.





Source link

Postagens Similares

  • 私が乗っていたバイクを3人の男が盗もうとしました!

    2026 年 3 月 20 日 ここ北ウェールズでは春の気配が漂っているので、昨日バイクで会社に行くことにしました。家に帰る途中、家からそれほど遠くないところで、信号待ちに座っていたところ、突然オフロードバイクに乗った3人の男が私を取り囲みました。左に 1 つ、右に 1 つ、右に 1 つが後輪まで。そして彼らは 本当に 私から数センチくらい近いです。 私はすぐに何かが起こりそうな不安を感じました。私たちは種として、このようなことに対する感覚を持っていると思います。とにかく、数秒後、私の左側の男が自転車のキーを取りに来たと思いますが、幸運なことに私はキーレスイグニッションを備えたBMWに乗っていました。 私はその男が何をしようとしているのかを観察し、パニックになり、彼の自転車の側面を全力で蹴りました。ありがたいことに、これは彼がバランスを崩して転倒するのに十分でした。それから私は右側の男の頭を殴りました。彼はヘルメットをかぶっていたので怪我はしなかったでしょうが、彼にショックを与えて数秒待つには十分だと思ったのでしょう。わかりませんが、この時点では基本的にパンツが脱げていました。 右隣の男にぶつかるやいなや、私はまったくの拍子木のように発進し、その過程で赤信号を無視しました(幸いなことに、何も来ていませんでした)。私のBMWは1000ccで170BHP以上の速いバイクです。彼らはダートバイクに乗っていたが、私のバイクほど速くはなかった。私は地元の道路についての知識も持っていましたが、そうでないことを望みました。私が飛び去ると、彼らは追いかけましたが、すぐに後退しました。スピードメーターをざっと見ただけで、時速120マイルを超えていたが、問題なく動作していた。 パニックになってどうしたらいいのかわかりませんでした – 家に帰りましょうか?もし彼らが私が車に乗り込んでいるのを見て、私の住んでいる場所を見つけたらどうしますか?どこか別の場所に行ったほうがいいでしょうか?しかし、ラッシュアワーなので、私が渋滞に巻き込まれたら、彼らは再び私に追いつく可能性があります。私の自転車は一般道では非常に速いですが、渋滞では彼らが有利になるでしょう。 私は床を床に置いて、できるだけ早く家に帰ることにしました。私の村へはまっすぐな道があるので、後ろから見えなくなったら、すぐにバイクを振り入れてガレージ(道路からは見えない)の後ろに隠れようと考えました。もしそれらが見えるなら、私はただ続けて、それらを失くそうと努力し続けるだろう。 今、車の運転に近づいているので、鏡をちらっと覗いてみましたが、何も見えませんでした。私は、子供たちがドライブで遊んでいないことを願いながら、危険を冒してグラベルドライブをできるだけ早く登ることに決めました。そうではありません。ガレージの後ろに飛び込んで待ちます…5秒…10秒…バイクが近づいてくる音が聞こえます。彼らは私の車道を通り過ぎて飛んでいき、単線の村の道路には速すぎます。 その後、妻は村のパブのオーナーに、監視カメラに何か映っていないか尋ねました。彼が私たちに見つけてくれたものは次のとおりです。 お使いのブラウザはvideoタグをサポートしていません。 そのうちの1台だけがナンバープレートを持っているようで、道路とほぼ平行なので、ビデオから特定することは不可能です。警察に通報し、法医学部門からの返答を待っています。私の自転車から何かプリントを拾えるかどうかを確認するためです。しかし、彼らが手袋をしていたかどうかは覚えていませんし、それが何かをもたらすかどうかはあまり自信がありません。 今は大丈夫ですが、とてもショックでした。彼らがもっと邪悪な何かではなく、日和見主義の愚か者であることを願うばかりです。私はすでにガレージ用にカメラを購入しました。 皆さん、外では安全に過ごしてください。 アップデート 警察の鑑識課が出動したところだ。私が彼らにビデオを見せると、彼らはバイクの跡を拭き取りました。予想通り、何も見つかりませんでした。昨日もその地域で自転車盗難未遂があり通報を受けたとのことでしたので、どうやら私だけではなかったようです。 家庭生活、バイク メールで返信 Source link

  • ایپل کے کل اعلانات کا سلیٹ

    ایپل نیوز روم پوسٹس: ایپل نے آئی فون 17 پرو اور آئی فون 17 پرو میکس کی نقاب کشائی کی آئی فون ایئر کو متعارف کرانا ، ایک کامیاب نیا آئی فون جس میں ایک پیشرفت ڈیزائن ہے ایپل نے آئی فون 17 کی شروعات کی ایپل نے ایپل واچ سیریز 11 کی شروعات کی…

  • ਈਰਾਨ ਵਿੱਚ ਸ਼ਾਸਨ ਤਬਦੀਲੀ ‘ਤੇ ਟਰੰਪ ਦਾ ਬਹੁਤ ਵੱਡਾ ਜੂਆ

    ਲਈ ਸਾਈਨ ਅੱਪ ਕਰੋ ਟਰੰਪ ਪ੍ਰੈਜ਼ੀਡੈਂਸੀ ਦੇ ਅੰਦਰਟਰੰਪ ਦੇ ਦੂਜੇ ਕਾਰਜਕਾਲ ਦੀ ਕਵਰੇਜ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ ਵਾਲਾ ਇੱਕ ਨਿਊਜ਼ਲੈਟਰ। ਸੰਯੁਕਤ ਰਾਜ ਅਮਰੀਕਾ ਈਰਾਨ ਦੇ ਖਿਲਾਫ ਜੰਗ ਵਿੱਚ ਗਿਆ ਹੈ. ਇਸ ਕਾਰਵਾਈ ਵਿੱਚ ਅਮਰੀਕਾ ਦਾ ਸਿਰਫ਼ ਇੱਕ ਸਹਿਯੋਗੀ-ਇਸਰਾਈਲ ਹੈ (ਖਾੜੀ ਦੇ ਅਰਬ ਰਾਜ, ਜੋ ਕਿ ਈਰਾਨੀ ਸ਼ਾਸਨ ਤੋਂ ਡਰਦੇ ਹਨ, ਈਰਾਨ ਦੇ ਨਿਸ਼ਾਨੇ ‘ਤੇ ਹਨ, ਪਰ ਹੁਣ…

  • 文本即思想,思想是神聖的

    Anthropic 的 Thariq Shihipar 最近發表了一篇發人深省的文章,他認為對於大多數人工智慧用例,我們從 Markdown 轉向 HTML。 我理解他的觀點並在某種程度上同意,但我不同意所提出的解決方案。 以下是我對他的論點的理解: 我完全明白為什麼他喜歡這些可作為簡報的可共享 HTML 檔案。 Markdown 很難閱讀和分享長文檔 純文字無法像格式、圖像和視覺層次結構那樣傳達思想 因此,我們應該將主要規範格式從 Markdown 轉移到 HTML。 他指出 Markdown 更難以分享和交流想法,因為格式和視覺效果可以讓事情變得非常容易理解。 我對這種方法的問題是,透過以可編輯性換取可讀性,我們將人類與創作過程進一步分開。 我重視 Markdown 因為我重視文本。我重視文本,因為我認為它是遠離思想的一步。 我相信思考是我們應該小心不要外包的一件事,而且我擔心這個想法偷偷帶入的東西是朝著使我們的創造對人類不透明邁出的重要一步。不僅是人工智慧的創造,也是我們的創造。 我之所以如此重視保羅·格雷厄姆,是因為在寫出超級乾淨的散文時需要進行思想壓縮工作。寫清楚很難,因為它需要清晰的思考。 文字讓你的想法赤裸裸,我喜歡這一點。 到底是什麼問題? 我們該怎麼做才能解決呢? 為什麼我們的解決方案比其他解決方案更好? 我喜歡在涉及任何技術之前將此類關鍵內容具體化為純文字的挑戰。 如果我們不是自己編寫文本,然後對其進行編輯,那麼感覺就像將一個強大的機器人帶到健身房一樣。 我擔心,如果我們對人工智慧產生共鳴並讓它吐出令人驚嘆的 HTML,我們會立即與這個想法脫節。例如這個想法到哪裡去了?它一開始只是共鳴,然後透過木材削片機變成了別人的 HTML。 我可以用 4 個簡單的項目符號來了解它嗎?我可以盯著它看嗎?我能對付它嗎?我可以調整一下嗎?這是一個想法。我需要與它聯繫。 當然,我們可以要求人工智慧將其出色的 HTML 文件總結為四個項目符號,但透過壓縮和擴展,我們會損失原始文件的一定比例。 也許我在這裡過於情緒化了。 我只是覺得,如果你沒有將艱苦的思考和寫作工作融入到最初的想法中,然後以人類易於閱讀和編輯的格式維護它,那麼你就以某種方式將一些神聖的東西交給了機器。我是作為一個徹底的人工智慧最大化主義者這麼說的。 但我明白他的觀點,而且我認為這是非常正確的。 使用巨大的文本文件很難解釋或說服人們相信事情。格式化有很大幫助。圖片有很大幫助。甚至是一個介面或一個影片什麼的。 所以我們在這方面是同步的。我只是認為以不同的方式得到結果可能會更好。 降價:人類書寫容易,人類閱讀困難。 超文本標記語言:對人類來說很難書寫,對人類來說很容易閱讀。 也許解決方案並不是將第一步轉移到 HTML,因為 HTML 對代理程式和人類來說都變得更加不透明(加上…

  • 评论:这就是它听起来的样子(罗杰斯和奥加斯)

    在 这就是它听起来的样子:你喜欢的音乐告诉你什么苏珊·罗杰斯(Susan Rogers)(与合著者奥吉·奥加斯(Ogi Ogas))为爱上歌曲的体验提供了一个科学的框架。本书的核心是听众档案,这是一个对我们的音乐“最佳听点”进行分类的系统框架。罗杰斯将聆听体验分为七个主要维度: “什么”: 旋律、歌词、节奏和音色。 “如何”: 真实性、新颖性和现实性。 虽然罗杰斯作为认知神经科学家的背景很突出,但她平衡了这一点与她在普林斯期间为普林斯进行时间工程的各种“幕后”轶事。 紫雨 时代以及她与 Geggy Tah 和 Barenaked Ladies 的合作。这些片段为临床方法提供了必要的人类脉搏。 有趣的方面之一是罗杰斯对新颖性和我们对音乐风险的兴趣的讨论。这是一条新颖性-流行度曲线:最简单、最熟悉的音乐在左边;右边是突破界限、复杂的音乐;纵轴为销量/受欢迎程度。这条曲线在不断发展,今天可能被认为很复杂的东西在未来很容易变得更加熟悉。 尽管它的形状代代相传,但随着不同的音乐创新变得司空见惯,曲线本身沿着新颖的轴稳定地向右滑动。曲线的顶峰——以及最流行的音乐风格——保留了熟悉和新颖元素的平衡,但随着观众习惯了音乐的进步,这些元素听起来会发生变化。 来源: 这就是它听起来的样子:你喜欢的音乐告诉你什么 通过苏珊·罗杰斯 我忍不住将其与雷蒙德·威廉姆斯的文化进化理论进行了比较: 主导的: 定义当前“主流”的音乐。 剩余: 过去的声音仍然塑造着我们的现在。 紧急情况: 突破界限的新“新颖”表达方式。 罗杰斯认为,我们的“唱片制作人大脑”正在不断扫描这些元素。然而,品味很少是静态的。您可能会发现您的个人资料会随着年龄的增长或根据您的社交环境而变化。这种流动性表明,听众档案并不是固定的 DNA 序列,而是随着我们的生命阶段而演变的活文件。 我们为自己构建的身份反映在我们收集和喜欢的东西中,以至于当我们揭示我们吃的食物、我们喜欢的爱好或我们喜欢的音乐流派的巨大变化时,了解我们的人明白我们身份的一些重要的东西已经发生了变化。实证研究表明,我们的个人身份概念与我们的音乐选择有关。 来源: 这就是它听起来的样子:你喜欢的音乐告诉你什么 通过苏珊·罗杰斯 另一件引人注目的事情是罗杰斯的个人资料和罪恶感的快乐概念之间的紧张关系。当我们将罗杰斯的科学与唐纳德·温尼科特的真我和假我的概念结合起来时,“内疚的快乐”往往只是我们之间的冲突 真实的自我 (对旋律的原始情感反应)和 虚假的自我 (我们为了满足社会期望而呈现的角色)。罗杰斯对该框架的意图是提供剥离“虚假自我”所需的结构,并理解为什么特定的音色或节奏会引起我们的共鸣,无论其感知的“酷”如何。与 Chilly Gonzales 的《Enya: A Treatise on Unguilty Pleasures》以及如何把握个人品味一起思考这一点是很有趣的。 在录音室安静的时刻,我喜欢请唱片制作人说出一种罪恶感的快乐——一张你会不好意思承认自己喜欢的唱片。这样的坦白可以具有深刻的启示意义。我们珍视的唱片暗中反映了我们音乐自我的各个方面,而我们不想让别人知道这些方面。 来源: 这就是它听起来的样子:你喜欢的音乐告诉你什么 通过苏珊·罗杰斯 曾经有人告诉我“没有人喜欢你的音乐”。当然,尽管如此,但讽刺的是,当谈到听众档案时,这是事实,我们都是独一无二的,没有平均水平。作为神经线路、个人历史和情感关联的结合,我们与歌曲的关系是独一无二的。 如果米歇尔·法贝尔…

  • గ్రామీణ గ్యారెంటీడ్ కనీస ఆదాయ చొరవను ప్రారంభించడం

    మాతో చేరాలని నేను అమెరికన్లను ఆహ్వానించి ఒక సంవత్సరం అయింది అమెరికన్ డ్రీమ్‌ను పంచుకోవడానికి ప్రతిజ్ఞ: 1. అమెరికా అంతటా అత్యంత అవసరమైన వారికి సమర్ధవంతంగా సహాయం చేస్తున్నాయని మీరు భావిస్తున్న మద్దతు సంస్థలు ప్రస్తుతం. 2. వచ్చే ఐదేళ్లలోపు కూడా సహకరించండి దీర్ఘకాలిక ప్రయత్నాల కోసం ప్రజల సమయం లేదా నిధుల అంకితభావం అమెరికన్ డ్రీమ్‌ను న్యాయంగా మరియు మా పిల్లలందరికీ సాధించగలిగేలా ఉంచడానికి. బంగారంగా ఉండండి, అమెరికా. 💛 వ్యక్తిగతంగా, నేను ఒక నిర్దిష్ట…

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *